import java.io.*;
public class Demo{
public static void main(String[] args) throws Exception{
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("D:/a.txt"),true));
out.writeObject("第一个对象!");
out.writeObject("第二个对象!");
out.close();
out = new ObjectOutputStream(new FileOutputStream(new File("D:/a.txt"),true));
out.writeObject("第三个对象!");
out.writeObject("第四个对象!");
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File("D:/a.txt")));
System.out.println(in.readObject());
System.out.println(in.readObject());
in.close();
}
}[/code]程序执行的时候,永远只会读取到咱们序列化的前两个对象,即String类型的 “第一个对象!”和“第二个对象!”。
也许您会说,“你胡说,你程序序列化了4个String对象,但是你却只读了前两个对象,当然读不到后边的对象了啊”。
事实真是如此吗? 若是用下面的代码,就会出错:[code=java]package org.cxy.test;
import java.io.*;
public class Demo{
public static void main(String[] args) throws Exception{
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("D:/a.txt"),true));
out.writeObject("第一个对象!");
out.writeObject("第二个对象!");
out.close();
out = new ObjectOutputStream(new FileOutputStream(new File("D:/a.txt"),true));
out.writeObject("第三个对象!");
out.writeObject("第四个对象!");
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File("D:/a.txt")));
System.out.println(in.readObject());
System.out.println(in.readObject());
System.out.println(in.readObject());
System.out.println(in.readObject());
in.close();
}
}[/code]现在按照您的要求,我读了4个对象进来,但是程序执行时,出现什么问题?[code=java]Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: ACED2005
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at org.cxy.test.Demo.main(Demo.java:14)[/code]吼吼,问题解决了,之所以出现这个异常,是因为,在反序列化读取时只会读到第一个结束符就停止,读到第一个结束符后程序就认为之后没有数据了,若仍然继续读,就会抛StreamCorruptedException异常了。这个异常和EOFException颇为相似。
因此,以后别用追加的方式序列化对象。要一次性序列化完所有的对象后,再关闭ObjectOutputStream 。