我正在制作一份日程表,我正在保存.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:2577)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at profegraba.Persistencia.main(Persistencia.java:81)
答案 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();
}
}