问题描述:在使用java.io.ObjectInputStream类的readObject()方法去读取包含有序列化了多个(两个及两个以上)类的文件时,当读取到第二个类时,会抛出题目中提到的异常.
原因:任何一个文件都有文件头(header)和文件体(body),java在以追加的方式写一个文件时,他每次都会向文件追加一个header,该header是无法识别的,所以回抛出该异常
解决方法:
java提供的对象输出流无法解决该问题,我们可以自己写一个java.io.ObjectOutputStream类的子类,该子类如下:
public class MyObjectOutputStream extends ObjectOutputStream {
protected MyObjectOutputStream() throws IOException, SecurityException {
super();
}
@Override
protected void writeStreamHeader() throws IOException {
}
public MyObjectOutputStream(OutputStream o) throws IOException{
super(o);
}
}
该类重写了父类中的writeStreamHeader()方法,该方法用于写入header信息,这里让他不进行任何操作,其他的全部使用父类的方法
在逻辑代码中,判断要写入的文件是否是第一次输入即可,代码如下:
Student s = new Student("godbless", "男");
File file = new File(filePath);
ObjectOutputStream oos = null;
if (!file.exists()) {
file.createNewFile();
}
if(file.length()==0){
new ObjectOutputStream(new FileOutputStream(file, true)).writeObject(s);
}else{
new MyObjectOutputStream(new FileOutputStream(file, true)).writeObject(s);
}
System.out.println("序列化完成");