如何从流中读取x个字节?

Gle*_*enn 10 java sockets io stream

我想一次从Socket 读取n个字节.我怎样才能做到这一点?

Mic*_*rdt 9

DataInputStream.readFully()

当然它可以阻止任意长时间......


Mar*_*ers 5

您可以创建一个辅助方法来完全填充缓冲区。像这样的东西:

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;
}
Run Code Online (Sandbox Code Playgroud)

然后你只需要传入一个 size 的缓冲区x

编辑

迈克尔发布了一个函数的链接,该函数基本上执行相同的操作。与我的唯一区别是它确实能够返回小于缓冲区长度的内容,但仅限于流结束的情况。 DataInputStream.readFully在这种情况下会抛出运行时异常。

因此,如果该行为的示例有用,我将保留我的答案。