![](/img/trans.png)
[英]When to use read() or read(byte[]) or BufferedInputStream?
[英]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.