1

我正在做一本日程安排书,我正在保存一个 .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){}  

}

正如你所看到的,catch 异常是空的,所以,当我使用我老师的代码时,它看起来工作得很好,但是,我在那里放了一个 println,它总是打印出来。意思是出了点问题,我很确定那是

while(fileIn != null)

因为 Netbeans 说这个表达式永远不会为空。所以我猜这个程序在他到达文件末尾后不知道该怎么做......有什么建议吗?提前致谢!

这是一个例外:

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)
4

3 回答 3

2

while 循环完全不正确

while (fileIn != null) {

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

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

您可以阅读直到获得 an EOFException,但我个人不会宽恕这一点。我建议您改为存储一个包含许多子对象的容器对象。 AnEOFException可能由于最后一个对象已被抛出以外的原因而被抛出阅读成功。但是,我很感激你可能被迫以这种方式编码来完成你的任务)。

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

于 2013-05-20T10:07:16.100 回答
2

ObjectInputStream.readObject()EOFException当到达流的末尾时抛出。你的循环应该是这样的形式while (true),或者for (;;)它应该包含一个catch (EOFException exc)打破循环的块。

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

于 2013-05-20T10:19:43.490 回答
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();
    }
}
于 2013-05-20T10:20:17.583 回答