在序列化对象中,使用ObjectOutputStream,由于该stream每new 一个对象都会调用writestreamheader,这样的话多次追加对象就会多次将header加入到流文件中。而在使用ObjectInputStream进行反序列化时 ,只new了一个stream对象,对应的也只readstreamheader一次,导致剩下的对象无法从流文件中解析出来。进入java的source code 发现writestreamheader写入了两个short数值magic、version。而通过getchannel.position() 返回的信息也可以看到在 new objectoutputstream前后fileoutputstream的大小差异也是4个byte,即两个short的长度。因此直接利用这一特征对fileoutputstream 进行截断 去除重复写入的streamheader部分,解决了这个问题,代码如下:
public void writeToFile(File s) throws IOException, IOException {
boolean isexist = false;
if(s.exists())
isexist=true;
long pos = 0;
FileOutputStream fo=new FileOutputStream(s,true);
ObjectOutputStream out = new ObjectOutputStream(fo);
if(isexist){
pos=fo.getChannel().position()-4;
fo.getChannel().truncate(pos);
}
out.writeObject(this);
out.close();
}