这是available
方法的javadoc,这就是它所说的:
返回可以在不阻塞的情况下读取的字节数。
bytes
因此,它不会返回数组/读取中存在的总数,而是返回bytes
在被阻止之前可以读取的数量。因此,它返回 0 是一个有效的场景。
现在,让我们看一下ObjectInputStream的 javadoc ,下面是简要说明:
超过分配数据结尾的非对象读取将反映数据的结尾,就像它们指示流的结尾一样:按字节读取将返回 -1 作为字节读取或读取的字节数,以及原始读取将抛出 EOFExceptions。如果没有对应的 writeObject 方法,则默认序列化数据的结尾标志着分配数据的结尾。
您在代码中尝试做的是read
原始数据(或无WriteObject
方法读取),因为它不是有效数据(for ObjectInputStream
)read
将始终返回-1。我能够EOFException
通过调用readObject
方法来重现。
然后我尝试写/读一个新对象并测试available
方法调用,看看下面的代码片段:
byte[] buffer = new byte[]{-84, -19, 0, 5};
System.out.println("\n" + Arrays.toString(buffer) + "\n");
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buffer);
System.out.println("buffer.length = " + buffer.length + "\nnew ByteArrayInputStream(buffer).available() is: " + new ByteArrayInputStream(buffer).available());
ObjectInputStream input = new ObjectInputStream(byteArrayInputStream);
System.out.println("input.available(): " + input.available());
// System.out.println(input.readObject()); //Uncomment to see EOFException
Date date = new Date();
System.out.println(date);
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteArrayOut);
out.writeObject(date);
byte[] bytes = byteArrayOut.toByteArray();
input = new ObjectInputStream(new ByteArrayInputStream(bytes));
System.out.println(input.available());
System.out.println(input.readObject());
代码reads
已写入对象并打印值。请注意,即使它正确读取对象并打印相同的对象,available
方法仍然返回 0。因此,我建议不要过度依赖,available
因为它的名称具有误导性 :)