【问题标题】:Why am I getting java.io.EOFException?为什么我得到 java.io.EOFException?
【发布时间】:2014-06-20 13:33:35
【问题描述】:

这是一种从包含 Show 类型的序列化对象的 .ser 文件中读取节目详细信息的方法。该方法成功返回列表,但之前给出了异常。为什么会这样,我该如何摆脱它?

public List<Show> populateDataFromFile(String fileName) {
        List<Show> shows=new ArrayList<Show>();
        ObjectInputStream obj=null;
    try {
        FileInputStream fin=new FileInputStream(fileName);
        obj=new ObjectInputStream(fin);
        Show show=null;
        while((show=(Show) obj.readObject())!=null)
        {
            shows.add(show);
            show.getShowName();
        }
        System.out.println(shows);
    } catch (IOException e) {
        e.printStackTrace();
    }catch(ClassNotFoundException e)
    {
        e.printStackTrace();
    }finally
    {
        try {
            obj.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return shows;
}

输出是

java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2571)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at com.util.DataManagerImpl.populateDataFromFile(DataManagerImpl.java:23)
at com.psl.Client.main(Client.java:9)
Show Name: Sahi re Sahi
Show Time: 6:30 PM
Seats Available: 40
Show Name: Ek Shyam Aapke Naam
Show Time: 6:30 PM
Seats Available: 40
Show Name: Moruchi Maushi
Show Time: 6:30 PM
Seats Available: 40
Show Name: All The Best
Show Time: 6:30 PM
Seats Available: 40
Show Name: Naksharanche Dene
Show Time: 6:30 PM
Seats Available: 40

主要方法是

public static void main(String[] args) {
    DataManager dm=new DataManagerImpl();
    List<Show>shows=dm.populateDataFromFile("ShowDetails.ser");
    // Call all the functionalities from here to test your code.    
    for(Show show:shows)
    {
        System.out.println("Show Name: "+show.getShowName());
        System.out.println("Show Time: "+show.getShowTime());
        System.out.println("Seats Available: "+show.getSeatsAvailable());
    }
}

【问题讨论】:

  • 无论如何都会返回列表,因为异常被捕获,因此不会停止方法的执行,它会正常返回。现在,如果某些数据已添加到列表中,这些数据将被返回
  • 这是有道理的,但是即使在摆脱了 finally 块并在 while 循环之后关闭流之后,我也会遇到同样的错误。

标签: java exception eof


【解决方案1】:

因为您已到达文件末尾。

您似乎认为 readObject() 在文件末尾返回 null。它没有。当且仅当你写了一个 null 时它才返回 null。

正确的测试是捕获 EOFException 并中断,直到 readObject() 返回 null。

【讨论】:

  • 你的意思是我可以使用像 while(1) 这样的条件并在循环内进行反序列化吗?如果可以。能举个例子吗?
  • 你自己举了一个例子。这并不难。
【解决方案2】:

EJP 是正确的,因为当文件中没有更多 Show 时,方法 readObject() 不会返回 NULL。

EJP 也提出了解决方案。我只是想提出几个其他的解决方案,但不是修复读取文件的代码,而是修复写入文件的代码。

目前,文件是通过多次调用writeObject()方法生成的,每次都有一个Show对象。除了这样做,您还可以:

  1. 创建一个包含节目的List 对象。将此List 写入文件。当您阅读此文件时,您可以将List 回读。您不必使用 while 循环,因此可以避免 EOF 异常检查。

  2. 首先将节目数量写入文件。之后,将节目一一写入文件。当您读取文件时,您需要先读取节目数量,它会告知您要从文件中读取多少节目。这将避免 EOF 异常检查。

【讨论】:

  • 它不会避免 EOFException 检查。无法保证写入过程实际上写入了标头计数指定的对象数量。它可能写得更少,然后被打断,或者以某种方式失败。它甚至可以写更多。你仍然需要处理 EOFException。
  • @EJP 没错。我假设该文件是完整的。也就是说,可以毫无问题地写入文件。如果不假设这一点,我们可能会得到其他异常,而不仅仅是 EOFException。
猜你喜欢
  • 1970-01-01
  • 2019-12-27
  • 2021-08-04
  • 2019-03-28
  • 2021-03-05
  • 2021-08-27
  • 2021-10-23
  • 2015-09-24
  • 1970-01-01
相关资源
最近更新 更多