-1

我对 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 的重置不会在它似乎是预期的情况下发生to,这会导致该方法从流中的错误位置读取并返回错误的值。

我们在 Solaris 上使用相同的代码,虽然我没有在这个平台上进行调试器逐步调试,但在 Solaris 下,程序运行良好,并且我试图修复的错误不会发生。我不知道的流是否存在一些特定于平台的问题?

谢谢。

4

2 回答 2

2

根据经验,您不能依赖一次性从流中读取整个数组。如果您查看文档,您会看到返回的read(byte[])是读取的字节数,可能是整个数组长度或更短。如果还没有数据,甚至为 0。并且读取少于整个数组是非常典型的(并且可能取决于操作系统)。

所以你必须确保你实际读取了 4 个字节。

于 2012-07-10T05:47:15.247 回答
1

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

你的理解是不正确的。

您的理解与 Javadoc 完全相反,它说它会在必要时阻塞,直到至少一个字节可用,读取可用的任何内容,并返回读取的字节数的计数,或者如果读取的是 EOS,则返回 -1。

于 2012-07-10T09:57:23.303 回答