byte[] buffer = new byte[1024];
int n = 0;
while ((n = input.read(buffer)) != -1){
output.write(buffer,0,n);
}
解释下这段代码:
定义的buffer数组用来缓存通过input读入的数据,因此定义的buffer大小只是决定了一次传入缓存的字节数量(注意:是while循环时一次传入的可读长度,而不是一直向buffer内传数据只能传1024),当然也可以将byte[ ]初始值定义成更大值。(切记:如果write时只使用write(buffer)而不是用长度n限制会由于buffer的初始值大小造成最终的输出流有问题。比如读取一个2049字节大小的文件时,初始值为byte[1024*2],第一次input读取时buffer被填满2048个字节,但下次读取时还剩2049-2048=1位字节未读取,所以buffer缓存中仅是第一位内容更新,其余位置还是被上次读取的数据占位。因此output第二次写入的大小还是2048,这样最终写入文件的大小就是2048*2。)
正如上文提到read(buffer)便是一次读1024字节的数据(read()表示一次读一个字节,即可读字节数为buffer.length),n表示每次循环能读到的下一段数据长度,output.write(buffer,0,n)则是根据读到的buffer数据写入output指向的文件。write()源码<code> write(b,off,len)</ code>指出: <code> OutputStream </ code>的<code> write </ code>方法在每个要写出的字节上调用一个参数的write方法。鼓励子类重写此方法并提供更有效的实现。如果<code> b </ code>是<code> null </ code>,则抛出<code>NullPointerException </ code>。如果<code> off </ code>为负数,或者<code> len </ code>为负数,或者<code> off + len </ code>大于数组<code> b </ code的长度>,然后抛出<tt> IndexOutOfBoundsException </ tt>。
while循环中的-1则是EOF(End Of File)结束标志,表示文件读取结束。因为ASCII代码值的范围是0~255,不可能出现-1。