我想一次从Socket读取 n 字节。我怎样才能做到这一点?
答案 0 :(得分:9)
当然它可以阻止任意长时间......
答案 1 :(得分:3)
您可以创建一个辅助方法来完全填充缓冲区。像这样:
public int fillBufferCompletely(InputStream is, byte[] bytes) throws IOException {
int size = bytes.length;
int offset = 0;
while (offset < size) {
int read = is.read(bytes, offset, size - offset);
if (read == -1) {
if ( offset == 0 ) {
return -1;
} else {
return offset;
}
} else {
offset += read;
}
}
return size;
}
然后你只需要传入一个大小为x
的缓冲区。
DataInputStream.readFully
会在这种情况下抛出运行时异常。
所以我会留下我的答案,以防这种行为的例子很有用。
答案 2 :(得分:2)
DataInputStream.readFully()会引发EOF异常。但还有另外两种方法没有:Commons IO IOUtils.read()和Guavas ByteStreams.read()。这两个都尝试读取最多N个字节,仅在EOF停止,并返回它们实际读取的数量。
答案 3 :(得分:1)
这是不可能的。底层平台无法保证这一点,因此Java也无法保证。您可以尝试读取 n 字节,但是您必须做好准备,以获得比请求的更少的内容。