正如标题所说,如果有更多的字节可用而不是缓冲区的大小,那么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);
答案 0 :(得分:1)
每次拨打read(byte[])
时,都会:
以前的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()
,这基本上会做同样的事情。