日期:2014-05-18  浏览次数:20723 次

输出流的一些不解,有代码!
InputStream in = context.openFileInput(filename);
ByteArrayOutputStream os = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];
int len = 0;

while((len = in.read(buffer)) !=-1)
{
os.write(buffer,0,len);
}


上面的代码中,while循环我有些不理解。

假设在当初的in中存在2000个数据。
按照此循环,len = in.read(buffer) 开始会读到1024个。这个时候 ,len = 1024;
由于buffer存满,接着可能执行os.write(buffer,0,len);
这样,在下一次循环中。
当len = 2000 - 1024的时候,继续往下读,发现到了文件末尾,所以len = -1;这个时候,buffer中存在的一些数据就不会写入到os中,因为 = -1的条件会让该循环终止。

如果不是如此:
那么是否每一次len被赋值,都会执行循环体,那么read一次究竟读入多少数据呢。len的值究竟会是多少???

是不是发生变化,还是根据某些元素(比如CPU,内存之类的)而确定一个固定的值。

在while循环没反应过来的时候,一下就往buffer里写入了很多的数据,接着就执行循环体 ?1024这个值有什么特殊的含义么?
如果真是这种情况,那么是否会瞬间往buffer里写入上万个字节,导致数据溢出呢?

如果不是如此,那么是一个字节,一个字节的往buffer里写入数据(或者某个其他固定的数值),那么这个1024和len存在有什么意义吗?

------解决方案--------------------
LZ何不打印下len呢?
另外,LZ可以试试1024数组读的方式,和一个byte一个byte读的方式,看看时间上的消耗情况。
然后再看看一些理论性的东西,可能帮助更大
------解决方案--------------------
楼主可以假设有2000个字节,由于你数组定义为1024,所以,在第一次循环的时候由于2000大于1024,所以这个数组会读满,也就是len等于1024,然后在os写入的时候,会把全部1024个字节都写如,再第二次循环的时候,只剩下2000-1024=976个字节,这时,由于buffer长度是1024,而实际只有976个有内容,所以os写的时候就根据len只写入有内容的976个字节,当第三次循环的时候,in已经到了末尾,无内容,所以len为-1,while条件为假,就不再像os中写内容!如果你想一个字节一个字节的读,也没问题,但是,在这个例子中你循环要2000次,如果字节更多,循环次数更多,性能估计会下降!如果按固定某个数值,首先你要知道in的长度,其次你还要找一个能整除的数值,这样再有些情况下是行不通的!