ObjectInputStream available()方法无法按预期工作(Java)

我一直在试图弄清楚为什么我编写的从文件中读取对象的方法不起作用,并意识到ObjectInputStream的available()方法给出了0,即使文件没有被完全读取。 在我使用FileInputStream available()方法来确定EOF之后,该方法确实有效,并且它工作正常!

为FileInputStream工作时,为什么该方法不适用于ObjectInputStram?

这是代码:

public static void getArrFromFile() throws IOException, ClassNotFoundException { Product p; FileInputStream in= new FileInputStream(fName); ObjectInputStream input= new ObjectInputStream(in); while(in.available()>0){ p=(Product)input.readObject(); if (p.getPrice()>3000) System.out.println(p); } input.close(); 

PS-我读过我应该使用EOFexception代替available(),但我只是想知道为什么这不起作用。

非常感谢!!!

因为,正如javadoc所说, available()返回可以无阻塞地读取的字节数的估计值。 基本InputStream实现始终返回0,因为这是一个有效的估计。 但无论它返回什么,它返回0的事实并不意味着没有任何东西可以阅读。 只有流不能保证至少有一个字节可以被无阻塞地读取。

虽然没有明确记载,但我从经验中已经意识到它与动态数据有关。 如果您的类只包含静态类型数据,则available()可以估计大小。 如果您的对象中存在动态数据,例如列表等,则无法进行该估算。

available()方法只是告诉你可以在没有阻塞的情况下读取多少字节。 它在常规代码中不是很有用,但是人们会看到这个名字并错误地认为它会做其他事情。

所以简而言之:不要使用available() ,这不是正确的使用方法。 流表示不同的结尾,例如返回-1或在ObjectInputStream的情况下,抛出EOFException