gpt4 book ai didi

java - DataInputStream 是否会通过顺序读取覆盖字节

转载 作者:行者123 更新时间:2023-12-01 10:57:56 24 4
gpt4 key购买 nike

正如标题所说,如果可用字节多于缓冲区大小,并且在第一次读取时丢失了一些字节,DataInputStream.read() 是否可以覆盖以前读取的字节?

对等点之间交换固定大小的数据包,并且套接字上可能有两个数据包可用。假设一个数据包的大小为 500,并且套接字上有两个总大小为 1000 的数据包可用。此外,假设读取从可用的 1000 个字节中获取了 400 个字节。

  • 是否有可能 read() 无法读取所有可用的 500 个字节?

  • 再次调用read会发生什么情况,有可能读取超过100个字节吗?

鉴于 javadoc,我不太清楚在这种情况下会发生什么:

The first byte read is stored into element b[0], the next one into b[1], and so on. The number of bytes read is, at most, equal to the length of b.

我想知道是否应按照注释中所示修改以下代码块以仅完整读取一个数据包。

    while ((readBytes = stream.read(buffer)) != -1) {

totalBytes += readBytes;

if (totalBytes < buffer.length) { // must this be != instead of < ?

continue;
}

// all bytes are available
else {

break;
}

最佳答案

每次调用read(byte[])时,它都会:

  • 阻塞,直到从输入中读取至少一个字节,或者关闭输入
  • 将输入中的字节复制到数组中,从数组的索引 0 开始
  • 当没有更多可用字节时返回(通常情况下,无论如何 - 它可能会有一些延迟,等待一段时间以获得更多可用字节)

没有之前的read调用的内存 - 它不会开始在前一个索引处写入数组。如果您想要这种行为,您需要自己编写:

byte[] buffer = new byte[500];
int totalRead = 0;
while (totalRead < buffer.length) {
// Pass in an offset and length, so we can keep reading into the
// next part of the array.
int bytesRead = input.read(buffer, totalRead, buffer.length - totalRead);
if (bytesRead == -1) {
throw new EOFException(); // Or whatever... stream ended early
}
totalRead += bytesRead;
}

...或者调用 readFully() 基本上会做同样的事情。

关于java - DataInputStream 是否会通过顺序读取覆盖字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33521234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com