bar*_*157 5 java sockets inputstream datainputstream
我正在使用DataInputStream从套接字读取一些字节.我有一个从流中读取的预期字节数(在解码头之后,我知道消息中有多少字节)它在99%的时间内工作但偶尔我会读取的字节数小于len.
int numRead = dis.read(buffer, 0, len);
什么可能导致numRead小于len?它不是-1.我希望read的行为在流被关闭或达到EOF之前就会阻塞,但是如果它是一个基于流的套接字,除非套接字关闭,否则这不会发生,对吧?
有没有办法从套接字读取字节,始终确保您读取len字节?
谢谢
Jon*_*eet 11
编辑:对于一般流,你只需继续阅读,直到你已经阅读了你想要的一切,基本上.对于DataInput(例如DataInputStream)的实现,您应该使用readFullyPeter Lawrey的建议.考虑到这个答案的其余部分与您刚才拥有的一般情况相关InputStream.
这是完全合理的的InputStream任何类型的给你较少的数据比你要求的,即使更多的是在它的途中.你应该总是为这种可能性编码 - 除了可能的例外ByteArrayInputStream.(当然,如果剩下的数据少于您要求的数据,那么仍然可以返回比所请求的更少的数据.)
这是我正在谈论的那种循环:
byte[] data = new byte[messageSize];
int totalRead = 0;
while (totalRead < messageSize) {
    int bytesRead = stream.read(data, totalRead, messageSize - totalRead);
    if (bytesRead < 0) {
        // Change behaviour if this isn't an error condition
        throw new IOException("Data stream ended prematurely");
    }
    totalRead += bytesRead;
}
您可以这种方式使用DataInputStream.
byte[] bytes = new byte[len];
dis.readFully(bytes);
这将返回所有数据读取或抛出IOException.