读取二进制文件时出现异常

时间:2013-05-18 12:40:38

标签: java ioexception

我得到了这个例外。是因为我没有抓住它们吗?

 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 ReadStudentRecord.readRecord(ReadStudentRecord.java:34)
at ReadStudentRecordTest.main(ReadStudentRecordTest.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

这是我的类,它读取二进制文件:

 import java.io.*;


public class ReadStudentRecord {

private ObjectInputStream input;

public void openFile() {

    try {
        input = new ObjectInputStream(new FileInputStream("student.dat"));

    } catch (IOException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
} // end of open file method

public void readRecord() {

    Q4 student;

    System.out.println("Student Name\t\t Student average Mark");
    try {

        while (true) {


            student = (Q4) input.readObject();

            System.out.println(student.getStudentName() + "\t\t\t" + student.averageMark(student.getMark()));

                 }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    } catch (IOException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }

}// end of readRecord method

public void closeFile() {
    try // close file and exit
    {
        if (input != null)
            input.close();
        System.exit(0);
    } // end try
    catch (IOException ioException) {
        System.err.println("Error closing file.");
        System.exit(1);
    } // end catch
} // end method closeFile
} // end of class

它工作正常,除了我得到上述异常,我不知道是什么原因导致它。 我无法弄清楚我做错了什么。

2 个答案:

答案 0 :(得分:3)

您正在无限循环中从文件中读取对象。

while (true) {
    student = (Q4) input.readObject();
        ...
}

最后,流到达文件的末尾,但您仍然需要更多对象,这就是抛出异常的原因。


一种可能的解决方案是捕获EOFException,这意味着不再存在对象。

try {
    while (true) {
        student = (Q4) input.readObject();
            ...
    }
}
catch (EOFException eof) {
    // Reached end of file. Do anything here, if you want.
    // Or else, just ignore the end of file, and proceed out of the block.
}
finally {
    // Some other stuff.
    // Do not forget to close the stream.
    input.close();
}

答案 1 :(得分:1)

<强>优选地

替换

while (true)

while (input.available() > 0)

另外,在catch (IOException e) {{>} readRecord之前立即添加

} catch (EOFException e) {
  // EOF reached
}