0

我有一个类可以读取 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在此方法所在的构造函数中声明

4

2 回答 2

1

移动这一行:

fileReader.close();

在你的for循环之后。

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

于 2012-07-06T16:40:25.017 回答
1

检查 students_updated.dat 文件的内容。readObject() 函数期望文件包含序列化对象。

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

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

访问此链接以获取有关如何序列化和反序列化数组的示例 -我可以直接序列化数组吗...

于 2012-07-06T17:00:40.310 回答