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

时间:2011-11-03 21:08:48

标签: java sockets io stream

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

4 个答案:

答案 0 :(得分:9)

DataInputStream.readFully()

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

答案 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 字节,但是您必须做好准备,以获得比请求的更少的内容。