java.io.StreamCorruptedException: invalid type code: AC
来源:互联网 发布:java中的类命名规范 编辑:程序博客网 时间:2024/05/19 14:56
问题情景:
问题描述: 用类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()
对象输出类
读取对象流:
实体类
问题描述: 用类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
package com.bjsxt.io.obj;import java.io.*;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);}@Overrideprotected 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);}}
对象输出类
package com.bjsxt.io.obj;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.io.OutputStream;/** * 序列化:将对象保存到磁盘内 * 1. 如何实现序列化? * 类实现接口 会产生 version ID * default * 动态生成 属性值不同 ID也不同 * public class Student implements Serializable * 2.某个属性不想被序列化 * 属性前+static * transient * * 反序列化:读取到磁盘内的对象数据 * @author Mr.Gao * */public class ObjectOutPutStreamTest {@SuppressWarnings("resource")public static void main(String[] args) throws IOException {//1.新建流对象//节点流File file = new File("D:\\object.txt");OutputStream os = new FileOutputStream(file,true);//缓冲流BufferedOutputStream bos = new BufferedOutputStream(os);//处理流//ObjectOutputStream oos = new ObjectOutputStream(bos); MyObjectOutputStream oos = MyObjectOutputStream.newInstance(file, bos); //2.写出数据Student s1 = new Student("李白", 34, 99);Student s2 = new Student("杜甫",32,89);System.out.println(file.length()); oos.writeObject(s1);oos.writeObject(s2);System.out.println("写出完毕");//3.关流oos.close();}}
读取对象流:
package com.bjsxt.io.obj;import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.ObjectInputStream;/** * 反序列化: 读取磁盘上的对象 反序列化时 反序列化的ID 必须与序列化的ID一致 * * @author Mr.Gao */public class ObjectInputStreamTest {public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {// 创建对象输入流对象// 读取对象ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("D:\\object.txt")));Object readObject = null;readObject = ois.readObject();// readObject = ois.readObject();System.out.println(readObject);System.out.println(ois.readObject());System.out.println(ois.readObject());// 关流ois.close();}}
实体类
package com.bjsxt.io.obj;import java.io.Serializable;public class Student implements Serializable{ private static final long serialVersionUID = 21L;private String name;private int age;//private int id;public Student(String name, int age, double score) {super();this.name = name;this.age = age;this.score = score;}public Student() {super();}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";}}
阅读全文
0 0
- java.io.StreamCorruptedException: invalid type code: AC
- java.io.StreamCorruptedException: invalid type code: AC
- java.io.StreamCorruptedException: invalid type code: AC异常
- .java.io.StreamCorruptedException: invalid type code: AC解决办法
- .java.io.StreamCorruptedException: invalid type code: AC解决办法
- java.io.StreamCorruptedException: invalid type code: AC解决办法
- java.io.StreamCorruptedException: invalid type code: AC解决办法
- java.io.StreamCorruptedException: invalid type code: AC错误的解决方法
- java.io.StreamCorruptedException: invalid type code: AC解决办法
- java.io.StreamCorruptedException: invalid type code: AC问题解决
- java.io.StreamCorruptedException: invalid type code: AC异常和对象流锁机制问题
- 多次创建object 写入对象文件中.java.io.StreamCorruptedException: invalid type code: AC解决办法
- 关于StreamCorruptedException: invalid type code: AC 异常
- tomcat8.0 启动报错 java.io.StreamCorruptedException: invalid type code: 3F
- 存储两次序列化对象,读取报错问题 java.io.StreamCorruptedException: invalid type code: A
- java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
- java.io.StreamCorruptedException: invalid stream header: ABACED00
- java.io.StreamCorruptedException: invalid stream header: 异常
- Java常见的几种排序方法
- 函数式接口和lambda表达式
- C++map如何按值排序
- LeetCode 重建BST
- Python快速入门(5)-列表与字典推导式
- java.io.StreamCorruptedException: invalid type code: AC
- 微信服务器和第三方服务器之间究竟是通过什么方式进行对话的?
- 操作系统概念(高等教育出版社,第七版)复习——第十一章:文件系统实现
- shiro从数据库中查询角色和权限
- HashMap死循环分析
- Spark调优之Cloudera博客(Part 2)
- vector 容器内部的实现(数组)具体实现参考boost库在另一篇文章
- 《软件工程——实践者的研究方法》重难点复习笔记(第十章——基于类的需求建模方法)
- 个人信息管理