EOFException using readObject() 反序列化 ArrayList



我正在尝试使用继承从类序列化实例。

这是我尝试序列化数据的类

public class Serializacion {
static int agregarProfeTitular(ProfesorTitular p){
int status = 0;
try {
FileOutputStream fos = new FileOutputStream("profestitulares.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
ArrayList pi = conseguirTodosProfesTitulares();
pi.add(p);
oos.writeObject(pi);
oos.close();
fos.close();
status = 1;
} catch (IOException e) {
System.out.println("Error al agregar el prof titular..."+Arrays.toString(e.getStackTrace()));
}
return status;
}
static ArrayList<ProfesorTitular> conseguirTodosProfesTitulares(){
ArrayList<ProfesorTitular> pi = new ArrayList<ProfesorTitular>();
try {
FileInputStream fis = new FileInputStream("profestitulares.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
pi = (ArrayList<ProfesorTitular>) ois.readObject();
ois.close();
fis.close();
} catch (Exception e) {
System.out.println("Error al conseguir a los profes titulares..."+e);
}
return pi;
}
}

最后,尝试捕捉扔了我

java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2950)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1534)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427)
at profesores.Serializacion.conseguirTodosProfesTitulares(Serializacion.java:69)
at profesores.Serializacion.agregarProfeTitular(Serializacion.java:46)

这个想法是,当我想在我的文件中写入一些数据时,我首先获取已经存在的数据将其解析为数组列表,然后返回该数组列表,我只是添加新数据。它可以写入文件,但读取它不起作用。

编辑:

这是我尝试序列化的类代码:

public class ProfesorTitular extends Profesor {
int horasBase;
public ProfesorTitular(int id, String nombre, String clase, int horasBase) {
super(id, nombre, clase);
this.horasBase = horasBase;
}
public int getHorasBase() {
return horasBase;
}
public void setHorasBase(int horasBase) {
this.horasBase = horasBase;
}

}
  1. 您为命名非常差的文件profestitulares.txt创建了一个FileOutputStream。序列化数据不是文本,不应保存在扩展名为 .txt 的文件中。
  2. 这将创建一个空文件。
  3. 然后,围绕此流创建一个ObjectOutputStream,该将写入对象流标头。
  4. 然后,为同一文件创建一个FileInputStream,该文件现在除了对象流标头之外都是空的,无论其以前的状态如何。
  5. 然后,您尝试围绕此问题创建一个ObjectInputStream,这将失败,因为此逻辑空文件中有一个流标头但没有对象。

解决方案:在创建新对象之前从文件中读取对象。

最新更新