FileOutputStream上的java.io.EOFException

时间:2012-07-06 16:35:18

标签: java arrays fileinputstream objectinputstream eofexception

我有一个类读取Student []数组对象的书面输出

这是代码

import java.io.*;

// I use this class to read the final ouput "students_updated.dat"
public class StudentArrayObjectFileReader {

public static void main(String[] args) {
    try {
        ObjectInputStream fileReader = new ObjectInputStream(new FileInputStream("students_updated.dat"));
        Student[] studs = (Student[]) fileReader.readObject();
        fileReader.close();

        // List the records in console
        for (int i = 0; i < studs.length; i++) {
            System.out.printf("%7d %-35s %-5s %1d %-6s%n",studs[i].getID(), studs[i].getName(), studs[i].getCourse(), studs[i].getYr(), studs[i].getGender());
        }
    } catch (FileNotFoundException fnfe) {

        fnfe.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
 }
}

问题是在阅读Student[] studs = (Student[]) fileReader.readObject();

时出错

如此处所述

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 StudentArrayObjectFileReader.main(StudentArrayObjectFileReader.java:9)

关于可能出现什么问题的任何想法?提前谢谢..

这就是students_updated.dat写的方式

    public void saveStudentArray() { // studs print to student_updated.dat
    try{
        output.writeObject(studs); // write the final studs
        output.close();
    }catch(Exception e){
        e.printStackTrace();
    }
}

在此方法所在的构造函数中声明了ObjectInputStream

2 个答案:

答案 0 :(得分:1)

移动此行:

fileReader.close();
for循环后

在Java中,变量的创建只是创建对内存中某个位置的引用。将从fileReader读取的对象转换为学生数组的行为只会创建指向内存中正确位置的指针。如果您通过关闭fileReader删除该位置,则删除studs指向的位置。

答案 1 :(得分:1)

检查students_updated.dat文件的内容。 readObject()函数要求文件包含一个序列化对象。

文件是否包含序列化对象?检查序列化是否成功,没有出现任何问题?

如果您尝试从纯文本文件构造数组,则不应使用readObject()。

访问此链接,获取有关如何序列化和反序列化数组的示例 - Can I serialize an array directly...