java 序列化ObjectOutputStream 同一文件追加写对象问题的解决
2014-04-25 13:54
621 查看
在序列化对象中,使用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();
}
转载地址 http://blog.csdn.net/wangquanjian/article/details/6259012#comments
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();
}
转载地址 http://blog.csdn.net/wangquanjian/article/details/6259012#comments
相关文章推荐
- Java对象序列化文件追加对象的问题,以及Java的读取多个对象的问题解决方法。
- Java对象序列化追加的问题,以及Java的读取多个对象的问题解决方法。
- Java对象序列化追加的问题,以及Java的读取多个对象的问题解决方法。
- (JAVA)从零开始之--对象输入输出流ObjectInputStream、ObjectOutputStream(对象序列化与反序列化)
- ObjectOutputStream读取文件多个对象时报出EOFException问题
- Java IO--对象序列化Serializable、ObjectOutputStream、ObjectInputStream、transient
- Java对象序列化ObjectOutputStream和ObjectInputStream示例
- 关于ObjectOutputStream在文件末尾追加的问题
- 对象序列化到本地文件 ObjectOutputstream ObjcetInputstream
- 我的Java开发学习之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法
- Java之序列化Object对象和字节数组或文件之间的转换
- Java IO操作——对象序列化(Serializable接口、ObjectOutputStream、以及与Externalizable接口的用法和区别)
- Java对象序列化ObjectOutputStream和ObjectInputStream示例
- java语言编程IO流之对象序列化和ObjectInputStream与ObjectOutputStream
- JAVA基础 day23 IO流的其他类 (对象的序列化 管道流 RandomAccessFile类(随机读取文件) DateStream(操作基本数据类型的流) 操作数组的流 )字符编码问题
- Java对象序列化ObjectOutputStream和ObjectInputStream示例
- Java基础之对象的序列化(持久化)操作对象ObjectInputStream/ObjectOutputStream
- 多次创建object 写入对象文件中.java.io.StreamCorruptedException: invalid type code: AC解决办法
- Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法
- 关于将Java中序列化对象写入byte[]遇到的一些问题及解决方法