Java BufferedInputStream读取(字节[])行为不一致

Java BufferedInputStream读取(字节[])行为不一致,java,bufferedinputstream,Java,Bufferedinputstream,我对BufferedInputStream.read(byte[])的理解是,读取操作从pos开始,一直读取到字节数组满或流结束 我正在对BufferedInputStream调用下面的readInt方法 public class XDRInputStream { private InputStream stream; private byte[] buffer4 = new byte[4]; // fixed size buffers private byte[] buffer8 = ne

我对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");
    }
}
公共类XDRInputStream{
私有输入流;
私有字节[]缓冲区4=新字节[4];//固定大小的缓冲区
专用字节[]缓冲区8=新字节[8];
公共XDRInputStream(输入流){
this.stream=流;
}
公共输入流getInternalStream(){
回流;
}
public int readInt()引发IOException{
if(stream.read(buffer4)!=-1){

return((buffer4[0]&0xFF)根据经验,您不能依赖于一次从流中读取整个数组。 如果您查看,您将看到
read(byte[])
的返回是读取的字节数,可能是整个数组长度或更小。如果还没有数据,则返回0。读取的字节数通常小于整个数组的长度(可能取决于操作系统)

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

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

你的理解是错误的


您的理解与Javadoc完全相反,Javadoc表示,如果必要,它会阻塞,直到至少有一个字节可用,读取任何可用的字节,并返回读取的字节数计数,如果读取EOS,则返回-1。

您当然是对的,该检查是我应该对代码进行的改进,但我不这么认为hink这就是我眼前问题的原因。只要看一下流缓冲区的内容,我就可以知道数据在那里,并且确实按照预期从缓冲区读取了4个字节-只是从一个意外的起点读取。找出了问题所在-如果pos等于缓冲区中的最后一个字节,则读取(字节[])将假定缓冲区已被完全读取,并调用fill()在新的代码中改写内容。必须在我的上行代码中实现这一点。@ GLR,只有在已经完全读取或跳过的情况下, PoS<代码>的唯一方式才是缓冲器的末尾。不要“假设”它。在到达您的“理解”之前,您是否考虑阅读JavaDoc?