繁体   English   中英

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

[英]How do I read x bytes from a stream?

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

DataInputStream.readFully()

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

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

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会在此方案中引发运行时异常。

所以我会留下我的答案以防万一这种行为的例子很有用。

MarkInputStream.readFully()在EOF上引发异常,正如Mark Peters指出的那样。 但还有另外两种方法:Commons IO的IOUtils.read()和Guavas ByteStreams.read () 这两个都尝试读取最多N个字节,仅在EOF停止,并返回它们实际读取的数量。

这是不可能的。 底层平台无法保证这一点,因此Java也无法保证。 您可以尝试读取n个字节,但是您必须准备好比请求的更少。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM