首页 > 解决方案 > 为什么在继续写入 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[].length16 个。它看起来像这样:[AAAA ---- ---- ----]。现在我把它写到 outputStream 中。outputStream 现在包含[AAAA ---- ---- ----]

在第二次迭代中,inputStream将另外 4 个字节[BBBB]写入byte[]. 我byte[]现在包含 8 个字节:[AAAA BBBB ---- ----]. 如果我将它byte[]写入我的 outputStream 中,偏移量为 0(的开头byte[]),这不会导致前 4 个字节像这样加倍: [AAAA AAAA BBBB ----]

标签: javaioinputstreamoutputstream

解决方案


您的错误是假设有一些东西可以跟踪数组内的偏移量,但没有。

/通常具有隐式偏移量InputStreamOutputStream例如,当它们写入文件时),但数组没有。

  • 您的第一次读取将留下您byte[]的值[AAAA ---- ---- ----](假设它读取 4 个字节)。
  • 您的第二次阅读将从开头开始byte[]并将其保留为 [BBBB ---- ---- ----]

这甚至在您的write调用中表示:第二个参数告诉您OutputStream从哪个索引开始读取,byte[]并且您始终提供 0(这对于这种循环是正确的)。


推荐阅读