使用ObjectInputStream读取文件时出现EOFException

时间:2012-10-02 03:16:43

标签: java

我基本上遇到了类似问题:EOFexception in Java when reading objectinputstream,但我找不到干净代码的答案。

答案表明当读者到达文件结尾时ObjectInputStream#readObject将抛出异常。在网上寻找解决方案之后,我还没有找到解决方案。对于这种情况,这可能是一个好的和干净的解决方案吗?

注意:我试过这个(但它看起来很难看并且不是干净的代码)。我正在寻找更好的解决方案:

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
try {
    Object o;
    while ((o = ois.readObject()) != null) {
        if (o instanceof MyClass) {
            MyClass m = (MyClass)o;
            //use the object...
        }
    }
} catch (EOFException eofex) {
    //do nothing
}  catch (IOException ioex) {
    throw ioex;
    //I have another try/catch block outside to control the life of the ObjectInputStream
}
//later in the code...
ois.close();

5 个答案:

答案 0 :(得分:13)

这就是应该发生的事情。你的代码错了。检查Javadoc。如果您撰写readObject(),则null仅返回null。它没有说任何关于在EOF返回null的事情。在readObject()返回null之前循环,只有在您通过null撰写writeObject()时才会停止,如果不是,则会获得EOFException。< / p>

答案 1 :(得分:12)

@ EJP的答案已经确定了。

但是,如果您是“例外不应该用于正常流量控制” club * 的付费会员,那么您可以避免必须赶上如果您可以使用其他方法确定何时停止,则例外;例如

  • 您可以使用作为intInteger对象发送的计数来启动流。
  • 您可以通过发送null来标记流的结尾。
  • 您可以通过发送一个特殊对象来标记流的结尾,这意味着“这就是结束”。它不需要是MyClass实例。
  • 您可以发送List<MyClass> ...但这意味着您无法“流式传输”对象。

请注意,这意味着您可以更改发件人端代码...


*这个俱乐部的成员资格要么能够同化循环论证,要么愿意盲目地接受教条作为真理。 :-)


不是重复参数 ad nauseam ,这里有一些链接到我的一些与“正常流量控制”辩论有关的答案:

如果你读完它们,你会发现我并没有坚定地走到篱笆的两边。相反,我认为你应该理解权衡取舍,并根据具体情况决定是否适用例外情况。

答案 2 :(得分:5)

你可以试试这个:

boolean check=true;
while (check) {
   try{
       System.out.println(ois.readObject());
   } catch(EOFException ex){
       check=false;
   }
}

答案 3 :(得分:1)

我遇到此错误是因为我忘记在编写数据的代码中关闭了ObjectOutputStream。一旦我用关闭输出流的代码再次写入数据,就可以很好地读取数据。

答案 4 :(得分:-1)

虽然NULL在到达文件末尾时未返回NULL,但如果您从文件结束时控制该文件,则可以在关闭输出流之前始终添加Boolean complete = false; ObjectInputStream in = <...> while(complete != true) { Object test = (Object)in.readObject(); if(test != null) { someArrayList.add(test); } else { complete = true; } } 。它将作为对象传递,但您可以测试文件结尾:

<div class="alert alert-success alert-dismissible fade in" role="alert" if.bind="message">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span>
    </button>
    <strong>Success!</strong> ${message}
</div>