我对 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 下,程序运行良好,并且我试图修复的错误不会发生。我不知道的流是否存在一些特定于平台的问题?
谢谢。