DataInputStream是否会使用顺序读取覆盖字节

时间:2015-11-04 11:54:46

标签: java sockets tcp

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

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

  • 如果read()可用,那么 while ((readBytes = stream.read(buffer)) != -1) { totalBytes += readBytes; if (totalBytes < buffer.length) { // must this be != instead of < ? continue; } // all bytes are available else { break; } 是否有可能无法读取所有500个字节?

  • 再次调用read时会发生什么,是否可能读取超过100个字节?

对于我来说,在javadoc:

的情况下发生了什么事情并不是很清楚
  

读取的第一个字节存储在元素b [0]中,下一个字节存储到b [1]中,依此类推。读取的字节数最多等于b的长度。

我想知道是否应修改下面的代码块,如注释所示,只能完全读取一个数据包。

Scalar mm = mean(img, img > 0);

1 个答案:

答案 0 :(得分:1)

每次拨打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(),这基本上会做同样的事情。