我有一个类读取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
答案 0 :(得分:1)
移动此行:
fileReader.close();
在for
循环后。
在Java中,变量的创建只是创建对内存中某个位置的引用。将从fileReader
读取的对象转换为学生数组的行为只会创建指向内存中正确位置的指针。如果您通过关闭fileReader删除该位置,则删除studs
指向的位置。
答案 1 :(得分:1)
检查students_updated.dat文件的内容。 readObject()函数要求文件包含一个序列化对象。
文件是否包含序列化对象?检查序列化是否成功,没有出现任何问题?
如果您尝试从纯文本文件构造数组,则不应使用readObject()。
访问此链接,获取有关如何序列化和反序列化数组的示例 - Can I serialize an array directly...