我BufferedInputStream.read(字节[])的理解是,读操作从POS开始,并读取直到字节数组已满或发生流的末尾。不一致的BufferedInputStream读取(字节[])行为
我呼吁在下面的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下的程序工作正常,我试图的bug修复不会发生。对于我不知道的流,是否会出现一些特定于平台的问题?
谢谢。
您是否在到达“理解”之前阅读Javadoc? – EJP 2012-07-10 09:58:08