读取时ObjectInputStream异常,并到达文件末尾

时间:2013-05-20 09:59:34

标签: java file objectinputstream

我正在制作一份日程表,我正在保存.txt我的所有对象,工作正常,当我阅读它们时,问题出现了,程序读取,当文件结束时,我的程序不知道该怎么做,我不会把我的代码放进去,因为它现在很乱,但这里是我老师的代码,这是一个我用作模板来做我的:

try{
  //***Instructions for reading***

  //It creates a streamobject with the file's name and asigned format

  FileInputStream fileIn = new FileInputStream("Serializado.txt");

  //It creates an inputobject, so it can represent the object

  ObjectInputStream objIn= new ObjectInputStream(fileIn);

  while (fileIn != null) {

    //with readObject() method,  it extracts the object's content                               

    obInp= (NewAlumno) objIn.readObject(); //Se hace un "cast" a NewAlumno
    System.out.print("Nombre   :" + obInp);
    System.out.print(", Sexo: " + obInp.getSexo());
    System.out.print(", Direccion: "+ obInp.getDireccion());    
    System.out.print(", Promedio: " + obInp.getpromedioPoo());
    System.out.print(", Telefono: " + obInp.getTelefono()+"\n");
  }

  objIn.close();
} catch(Exception e){}  

}

正如你所看到的,捕捉异常它是空的,因此,当我使用我的老师的代码时,看起来它完美无缺,但是,我在那里放了一个println,它总是打印出来。这意味着什么是错的,而且我非常确定这是

while(fileIn != null)

因为Netbeans说这个表达式永远不会为空。因此,我猜测该程序在到达文件末尾后不知道该怎么做......任何sugestions伙伴?先谢谢你!

以下是例外:

java.io.EOFException 
  at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2‌​577) 
  at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315) 
  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
  at profegraba.Persistencia.main(Persistencia.java:81)

3 个答案:

答案 0 :(得分:2)

while循环完全不正确

while (fileIn != null) {

如果输入文件存在,则fileIn将始终为非null。您应该在构造fileIn后立即检查它是否为空,但是,如果文件路径错误。

如果没有while循环,那么您只需从流中读取一个对象。不管这是否正确,我不知道。但是,通常应该知道有多少对象被写入流中,以便可以回读相应数量的对象。

你可以阅读,直到你得到EOFException,但我个人不会宽恕。我建议你存储一个带有许多子对象的容器对象。{{{ 1}}可能因为最后一个对象已被成功读取而被抛出。但是,我感谢您可能被迫以这种方式编写代码以完成作业

最后,您需要确保输入流已关闭,即使发生异常也是如此。如果您使用的是Java 7,try-with-resources construct可以使这更容易。

答案 1 :(得分:2)

到达流的末尾时,

ObjectInputStream.readObject()抛出EOFException。您的循环应该采用while (true)for (;;)的形式,并且应该包含一个突破循环的catch (EOFException exc)块。

测试while (fileIn != null)完全是徒劳的。

答案 2 :(得分:1)

该异常意味着您到达了文件的末尾,但仍然要求读取更多对象。该程序无法再读取,因为它已到达文件的末尾,因此抛出了异常。

如前所述,您应该更仔细地处理资源。

您应该捕获异常并自然处理它。

ObjectInputStream objIn = null;
try {
    FileInputStream fileIn = new FileInputStream("Serializado.txt");
    if (fileIn == null) {
        throw new IOException("Can't find file.");
    }
    objIn= new ObjectInputStream(fileIn);

    while (true) {
        obInp= (NewAlumno) objIn.readObject();
        System.out.print("Nombre   :" + obInp);
        System.out.print(", Sexo: " + obInp.getSexo());
        System.out.print(", Direccion: "+ obInp.getDireccion());    
        System.out.print(", Promedio: " + obInp.getpromedioPoo());
        System.out.print(", Telefono: " + obInp.getTelefono()+"\n");
    }
} catch (EOFException e) {
    // Ignore or do whatever you wanted to signal the end of file.
} catch (Exception ex) {
    ex.printStrackTrace();
} finally {
    try {
        if (objIn != null) {
            objIn.close();
        }
    } catch (IOException closeException) {
        closeException.printStackTrace();
    }
}