问题情景:
问题描述: 用类ObjectOutputStream向文件写读对象时,碰到一个问题:新建一个文
件,用输出流ObjectOutputStream向文件连续写几个对象,关闭输出流,然
后读取,这些对象都可以读出;这时在向该文件增加对象,新写的对象就读不出了,不知什么原因?请教了!
问题出现的原因:ObjectOutputStream建立后第一次写入一个对象时, 会在对象数据前写入一些标志的数据“AC ED
00 05”(用ultraEdit打开),应该是流相关的信息。当你关闭
ObjectOutputStream后再重新打开往文件里面写对象时(append方式),就会再一次把“AC ED 00
05”写入文件,而这些信息并不是你写入对象的数据,所以当你用ObjectInputStream来读取对象时,流会将除第一个“AC ED 00
05”以外的数据当作各个对象的数据,造成无法解析,所以读取时有一个java.io.StreamCorruptedException出现。
这个可以通过编辑Info.dat来验证,只要将“AC ED 00 05”删除(第一个“AC ED 00 05”保留)就可以正常读出后来加入的对象。
给出一个比较笨的解决方法: 在以后要添加新的对象到Info.dat时,将里面原有的对象读出放入ArrayList中,清空文件,再将对象集一次写入。
尝试解决办法: 那个“AC ED 00 05”是
ObjectOutputStream.writeSystemHeader()写进去的,你可以继承ObjectOutputStream类,覆盖这个方法。
在你自己的writeSystemHeader()里判断是不是第一次写入一个文件,如果是向一个文件大小不为零的文件追加的话,就调用
super.reset(),如果是第一次写这个文件,不是追加,就调用super.writeSystemHeader()
自定义类MyObjectOutputStream
public class MyObjectOutputStream extends ObjectOutputStream {
//定义成静态的好处
private static File f;
/**
* 初始化静态文件对象,并返回类对象
* @param file 文件对象,用于初始化静态文件对象
* @param out 输出流
* @return MyObjectOutputStream
* @throws IOException
*/
public static MyObjectOutputStream newInstance(File file, OutputStream out)
throws IOException {
f = file;//本方法最重要的地方:构建文件对象,是两个文件对象属于同一个
return new MyObjectOutputStream(out, f);
}
@Override
protected void writeStreamHeader() throws IOException {
if (!f.exists() || (f.exists() && f.length() == 0)) {
super.writeStreamHeader();
} else {
super.reset();
}
}
public MyObjectOutputStream(OutputStream out, File f) throws IOException {
super(out);
}
}
测试方法:
public static void writeObject() throws Exception {
String filename = "test.txt";
File f = new File(filename);
OutputStream os = new FileOutputStream(f, true);
MyObjectOutputStream moos = MyObjectOutputStream.newInstance(f, os);
moos.writeObject("abc");
moos.writeObject(1);
moos.close();
}
分享到:
相关推荐
socket objectoutputstream 传对象 例子 网上找的很好用,在网上留一份
Java保存与读取文件代码示例,super("存储与读取对象"); //调用父类构造函数 Container container=getContentPane(); //得到容器 Icon imageIcon=new ImageIcon("image.gif"); //实例化一个图标 ...
python-javaobj 是一个 python 库,它提供了读取和写入(写入当前是 WIP)Java 对象的函数,序列化或将被ObjectOutputStream反序列化。 这种对象表示形式是 Java 世界中的标准数据交换格式。 javaobj 模块公开了...
ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。 ObjectOutputStream.PutField 提供对要写入 ObjectOutput 的持久字段的编程访问。 ObjectStreamClass 类的序列化...
在该方法中,首先通过FileInputStream和ObjectInputStream读取源文件对象,然后通过ObjectOutputStream将读取的对象写入备份文件中。这个简单的示例代码展示了如何使用Java序列化来实现一个文件备份工具的简单功能,...
saveContactsToFile()方法使用FileOutputStream和ObjectOutputStream对象将通讯录数据写入文件中。如果写入失败,会抛出IOException异常。 addContact()方法用于添加新的联系人信息到通讯录中,并自动将更新后的...
错误原因:序列化问题,由于使用seata自带的zk-config.sh脚本向zk写入配置信息的时候,采用的序列化方式相当于String.getBytes(),而框架读取配置的时候使用的是org.101tec包中的Zkclient客户端,反序列化使用的是该...
ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持。本文给大家详细介绍了ObjectInputStream 和 ObjectOutputStream的相关知识,感兴趣的朋友一起学习吧
|--ObjectOutputStream/:将java对象的基本数据类型和图形写入到OutputStream。 | |--PipedOutputStream/:可以将管道输出流连接到管道输入流来创建通信管道。 | 用方法connect(PipedInputStream snk) 将此管道...
JavaIO对象流 FileInputStream 与 ObjectInputStream 和 ObjectOutputStream 的组合 奥利弗·缪尔
主要介绍了java序列化与ObjectOutputStream和ObjectInputStream的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
import java.io.ObjectOutputStream; public class TestObjectOutputStream { public static void main(String[] args) { try { //1.创建ObjectOutputStream类型的对象与c:/a.txt文件关联 ObjectOutputStream...
如果写文本文件,推荐使用PrintWriter,当创建好PrintWriter对象后,调用其println和print方法可以将字符串一行行的写入到文本文件,使用方法与System.out.println, System.out.print完全一样 具体使用方法,请见...
FilterReader 是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。 InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 可以说是一...
录入输出项目,帮助网友解决问题:1、界面的切换,2、对象序列化问题ObjectInputStream ObjectOutputStream 储存数据用的记事本系列化对象的方法
反序列化: 就是使用流的技术将文件中的数据读取到对象中。 使用到的流技术 序列化:ObjectOutputStream 反序列化:ObjectInputStream ObjectOutputStream介绍 (序列化) 构造: ObjectOutputStream(OutputStream out...
序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库等系统中,并在需要时把该流读取出来重新构造...
java-反序列化恢复 该项目旨在恢复使用java.io.ObjectOutputStream创建的文件
ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream("privateKey.dat")); //保存私钥到文件privateKey.dat oout.writeObject(keyPair.getPrivate()); //序列化私钥 oout.close(); //...
//此处创建文件写入流的引用是要给ObjectOutputStream的构造函数玩儿 FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = new FileOutputStream(path); oos = new ObjectOutputStream...