为什么在继续写入 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(这是正确的这种循环)。
我正在通过 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(这是正确的这种循环)。