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

时间:2014-02-09 17:09:43

标签: 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();

P.S- 我已经读过我应该使用EOF异常代替available(),但我只是想知道为什么这不起作用。

非常感谢!!!

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我发现了一些把戏!如果您仍想使用.available()读取所有对象到末尾,则在写入以下内容时,可以在添加每个对象(例如:out.writeInt(0))之前添加整数(例如:out.writeObject(obj))。文件,并在读取每个Object之前读取整数。因此.available()可以读取文件上剩余的字节,并且不会崩溃!希望对您有帮助!

答案 4 :(得分:0)

使用 InputStream 的可用函数代替 ObjectInputStream。然后如果有任何数据,将它们作为对象获取。 类似的东西:

if(inputStreamObject.available() > 0){
 Object anyName =  objectInputStreamObject.readObject();
}

您可以直接从 Socket 获取 inputStreamObject。 我用过,问题解决了。