ObjectOutputStream 追加写入读取错误
来源:互联网 发布:网络流行欧美歌曲 编辑:程序博客网 时间:2024/06/08 19:45
问题描述:
用类ObjectOutputStream向文件写读对象时,碰到一个问题:新建一个文件,用输出流ObjectOutputStream向文件连续写几个对象,关闭输出流,然 后读取,这些对象都可以读出;这时在向该文件增加对象,新写的对象就读不出了
问题出现的原因:
ObjectOutputStream建立后第一次写入一个对象时, 会在对象数据前写入一些标志的数据“AC ED 00 05”(用二进制方式查看打开),应该是流相关的信息。当你关闭 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
/** * 此类继承ObjectOutputStream,重写writeStreamHeader()方法,以实现追加写入时去掉头部信息 */public static class MyObjectOutputStream extends ObjectOutputStream {private static File f;// writeStreamHeader()方法是在ObjectOutputStream的构造方法里调用的// 由于覆盖后的writeStreamHeader()方法用到了f。如果直接用此构造方法创建// 一个MyObjectOutputStream对象,那么writeStreamHeader()中的f是空指针// 因为f还没有初始化。所以这里采用单态模式private MyObjectOutputStream(OutputStream out, File f) throws IOException, SecurityException {super(out);}// 返回一个MyObjectOutputStream对象,这里保证了new MyObjectOutputStream(out, f)// 之前f已经指向一个File对象public static MyObjectOutputStream newInstance(File file, OutputStream out) throws IOException {f = file;// 本方法最重要的地方:构建文件对象,两个引用指向同一个文件对象return new MyObjectOutputStream(out, f);}@Overrideprotected void writeStreamHeader() throws IOException {// 文件不存在或文件为空,此时是第一次写入文件,所以要把头部信息写入。if (!f.exists() || (f.exists() && f.length() == 0)) {super.writeStreamHeader();} else {// 不需要做任何事情}}}
测试方法:
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();}
0 0
- ObjectOutputStream 追加写入读取错误
- ObjectOutputStream以追加方式写入文件
- ObjectOutputStream在文件末尾多次追加写入对象的解决方案
- ObjectInputStream和ObjectOutputStream读取写入边界判定
- VB.net 文件读取、写入、追加操作
- Python处理Excel 写入,读取和追加
- 通过ObjectOutputStream向一个文件中多次以追加方式写入object的解决方案
- ObjectOutputStream 对象追加的实现
- ASP.NET写入 、读取 、 删除、追加cookie数组
- JAVA IO(读取,写入,追加,创建,删除,复制)
- Python3--文件读取、写入、追加及seek()方法的使用
- java(147)字节流文件读取,写入,追加文件
- ObjectInputStream和ObjectOutputStream的用法(Map数据读取和写入)
- 文件读取,写入(去除源文件内容)以及追加写入(保留原文件内容)
- Java 追加写入文件
- 追加写入txt
- hdfs文件追加写入
- golang追加写入文件
- 第十五周项目二 (2)用哈希法组织关键字
- UML——活动图、状态图
- Android IntentService的使用与源码解析
- 第三章-循环语句
- 二叉搜索 方法
- ObjectOutputStream 追加写入读取错误
- Robi改造计划-开篇
- android Installation error: INSTALL_FAILED_DUPLICATE_PERMISSION 解决方案
- uLua中遇到的问题
- ubuntu中wine的安装位置
- Windows程序设计--设置滚动条详解二
- ucenter单点登录
- Mysql5.7在linux上安装步骤
- House Robber I & II | LeetCode