java - 为什么在继续写入 OutputStream 时偏移 0 不会导致重复字节?
问题描述
我正在通过http请求下载文件并将其读取InputStream
到abyte[]
并将其写入byte[]
aoutputStream
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
InputStream is = conn.getInputStream();
int byteRead;
buf = new byte[conn.getContentLength()];
while ((byteRead = is.read(buf)) != -1) {
outStream.write(buf, 0, byteRead);
}
假设我byte[].length
是 16。在第一次迭代中,inputStream
将 4 个字节[AAAA]
写入byte[]
. 我现在有一个byte[]
4 个字节,总共byte[].length
16 个。它看起来像这样:[AAAA ---- ---- ----]
。现在我把它写到 outputStream 中。outputStream 现在包含[AAAA ---- ---- ----]
在第二次迭代中,inputStream
将另外 4 个字节[BBBB]
写入byte[]
. 我byte[]
现在包含 8 个字节:[AAAA BBBB ---- ----]
. 如果我将它byte[]
写入我的 outputStream 中,偏移量为 0(的开头byte[]
),这不会导致前 4 个字节像这样加倍: [AAAA AAAA BBBB ----]
?
解决方案
您的错误是假设有一些东西可以跟踪数组内的偏移量,但没有。
/通常具有隐式偏移量InputStream
(OutputStream
例如,当它们写入文件时),但数组没有。
- 您的第一次读取将留下您
byte[]
的值[AAAA ---- ---- ----]
(假设它读取 4 个字节)。 - 您的第二次阅读将从开头开始
byte[]
并将其保留为[BBBB ---- ---- ----]
这甚至在您的write
调用中表示:第二个参数告诉您OutputStream
从哪个索引开始读取,byte[]
并且您始终提供 0(这对于这种循环是正确的)。