①、ByteArrayOutputStream通常用于在内存中创建一个字节数组缓冲区,数据被“临时”放在此缓冲区中,并不会输出到文件或者网络套接字中——就好像一个中转站,负责把输入流中的数据读入到内存缓冲区中,你可以调用它的toByteArray()方法来获取字节数组。
来看下例。
public static byte[] readBytes(InputStream in, long length) throws IOException {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int read = 0;
while (read < length) {
int cur = in.read(buffer, 0, (int) Math.min(1024, length - read));
if (cur < 0) {
break;
}
read += cur;
bo.write(buffer, 0, cur);
}
return bo.toByteArray();
}
ByteArrayOutputStream的责任就是把InputStream中的字节流“一字不差”的读出来——这个工具方法很重要,很重要,很重要——可以解决粘包的问题。
要上溯到上个世纪80年代,由于处理器的运行速度越来越快,慢慢地,处理器需要从内存中读取数据的速度需求就越来越高了.然而内存的速度提升速度却很缓慢,而能高速读写数据的内存价格又非常高昂,不能大量采用.从性能价格比的角度出发,英特尔等处理器设计生产公司想到一个办法,就是用少量的高速内存和大量的低速内存结合使用,共同为处理器提供数据.这样就兼顾了性能和使用成本的最优.而那些高速的内存因为是处于cpu和内存之间的位置,又是临时存放数据的地方,所以就叫做缓冲存储器了,简称“缓存”.它的作用就像仓库中临时堆放货物的地方一样,货物从运输车辆上放下时临时堆放在缓存区中,然后再搬到内部存储区中长时间存放.货物在这段区域中存放的时间很短,就是一个临时货场. 最初缓存只有一级,后来处理器速度又提升了,一级缓存不够用了,于是就添加了二级缓存.二级缓存是比一级缓存速度更慢,容量更大的内存,主要就是做一级缓存和内存之间数据临时交换的地方用.现在,为了适应速度更快的处理器p4ee,已经出现了三级缓存了,它的容量更大,速度相对二级缓存也要慢一些,但是比内存可快多了. 缓存的出现使得cpu处理器的运行效率得到了大幅度的提升,这个区域中存放的都是cpu频繁要使用的数据,所以缓存越大处理器效率就越高,同时由于缓存的物理结构比内存复杂很多,所以其成本也很高.。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-92393-3.html
真的