read()
中的copyFile()
方法从输入流中读取buf.length
个字节,然后从头开始将它们写入输出流中,直到len
。
public static boolean copyFile(InputStream inputStream, OutputStream out) {
byte buf[] = new byte[1024];
int len;
try {
while ((len = inputStream.read(buf)) != -1) {
out.write(buf, 0, len);
}
out.close();
inputStream.close();
} catch (IOException e) {
return false;
}
return true;
}
如果我们总是从头开始写入输出流,那么上次迭代的数据是否不会被覆盖?
我们不需要跟踪偏移量吗?例如,如果第一次迭代写入1024个字节,那么第二次迭代应写入out.write(buf,1024,len);
。
答案 0 :(得分:0)
事实是buf
是一个缓冲区,而不是整个数据流。
此外,您正在使用public int read(byte[] b)
方法,这意味着它与read(b, 0, b.length)
相同。因此,缓冲区应指向数据的下一个buf.length值。
有关更多信息,请检查https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read(byte[])。
答案 1 :(得分:0)
@Arnaud发表评论
开始是数组的开始,而不是流的开始。数据在 每次都将事实附加到上一个。
我不小心快速扫描文档,并从“从指定的字节数组开始,将len个字节从偏移量写入此输出流” ,我明白了off
是流的偏移量。