繁体   English   中英

不一致的BufferedInputStream read(byte [])行为

[英]inconsistent BufferedInputStream read(byte[]) behaviour

我对BufferedInputStream.read(byte [])的理解是,读取操作从pos开始,并且读取直到字节数组已满或流结束。

我在BufferedInputStream上调用以下readInt方法。

public class XDRInputStream {

private InputStream stream;

private byte[] buffer4 = new byte[4]; // fixed size buffers
private byte[] buffer8 = new byte[8];

public XDRInputStream(InputStream stream) {
    this.stream = stream;
}

public InputStream getInternalStream() {
    return stream;
}

public int readInt() throws IOException {
    if (stream.read(buffer4) != -1) {
        return ((buffer4[0] & 0xFF) << 24)
             | ((buffer4[1] & 0xFF) << 16)
             | ((buffer4[2] & 0xFF) << 8)
             | ((buffer4[3] & 0xFF));
    } else {
        throw new EOFException("End of stream");
    }
}

当我在Eclipse调试器中跟踪执行情况时, stream.read(buffer4)调用-不管起始pos值如何-通常都会导致pos的值设置为4,并且读取的4个字节是输入中的前四个字节流。 在某些情况下,read(byte [])调用会静默重置流吗? 这似乎是预期的行为(这不是我的代码),以这种方式运行时,程序可以正常运行。

我遇到的问题是,有时仅在Windows上,并且仅当输入流包含特定内容时(在这种情况下,此错误消息是由于上游的套接字丢失而导致的),这种pos重置不会在预期的情况下发生到,这导致方法从流中的错误位置读取并返回错误的值。

我们在Solaris上使用相同的代码,虽然我尚未在该平台上完成调试器的逐步调试,但是在Solaris下,该程序运行良好,并且不会发生我尝试修复的错误。 我可能不知道与流有关的特定于平台的问题吗?

谢谢。

根据经验,您不能一次依赖于从流中读取整个数组。 如果您查看文档 ,将会看到read(byte[])返回值是read(byte[])数,它可以是整个数组的长度或更少。 如果尚无数据,甚至为0。 而且读取少于整个阵列是非常典型的(可能取决于OS)。

因此,您必须确保您实际读取了4个字节。

我对BufferedInputStream.read(byte [])的理解是,读取操作从pos开始,并且读取直到字节数组已满或流结束。

您的理解不正确。

您的理解与Javadoc完全矛盾,Javadoc表示,如果有必要,它将阻塞,直到至少一个字节可用,再读取可用的任何内容,然后返回读取的字节数计数;如果改为读取EOS,则返回-1。

暂无
暂无

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

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