为什么在继续写入 OutputStream 时偏移量为 0 不会导致重复的字节?

Why does offset 0 when continuesly writing to OutputStream not result in dublicated Bytes?

我正在通过 http 请求下载文件并将 InputStream 读取到 byte[] 并将其写入 byte[]outputStream

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。 在第一个 while 迭代中,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(这是正确的这种循环)。