ObjectInputStream java.io.StreamCorruptedException: invalid type code: AC问题解决
感谢原文作者:攻城狮_无名
原文链接:https://blog.csdn.net/mingyang_2016/article/details/75208117
问题描述:
每次向一个文件中序列化对象时 ,每次只想向文件末尾追加对象,而不是覆盖,可以使用FileInputStream(文件名,true);在读取数据的时候第一次会正常读取,不会报错,当读取第二次的时候,就会报出java.io.StreamCorruptedException: invalid type code: AC的错误。
问题分析:
由于用FileInputStream(文件名,true)向同一个文件中序列化对象,每次都会向文件中序列化一个header。在反序列化的时候每个 ObjectInputStream 对象只会读取一个header,那么当遇到第二个的时候就会报错,导致出现异常。
解决方案:
一共三种方法,推荐使用第二种;
一、运用集合:
在第一次序列化对象之前,把要序列化的对象添加到集合中,把这个集合序列化到文件中。然后每次序列化之前,除了把准备序列化的对象添加到集合中,再把已经序列化的集合反序列化回来添加到集合中,然后再把集合序列化到文件中。
二、重写ObjectOutputSream的writeStreamHeader()方法:
判断是不是第一次写入,若是则写入头部,若不是则不写入头部
/**
重写writeStreamHeader()方法
*/
class MyObjectOutputStream extends ObjectOutputStream{
public MyObjectOutputStream(OutputStream out) throws IOException {
super(out);
}
public void writeStreamHeader() throws IOException{
return;
}
}
public class SerializableDemo01{
//main方法
public static void main(String[] args) throws Exception {
File file = new File(".\\b.txt");
Person p = new Person("lisi",19);
set(file,p);
List<Person> list = get(file);
for(Person per:list){
System.out.println(per);
}
}
//序列化
public static void set(File file,Person p) throws Exception{
FileOutputStream fos = new FileOutputStream(file,true);
/**
判断是否是第一次写入
*/
if(file.length()<1){
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.close();
}else{
MyObjectOutputStream mos = new MyObjectOutputStream(fos);
mos.writeObject(p);
mos.close();
}
}
//反序列化
public static List<Person> get(File file) throws Exception{
List<Person> list = new ArrayList<Person>();
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
while(fis.available()>0){
Person p = (Person) ois.readObject();
list.add(p);
}
ois.close();
return list;
}
}
三:不重写ObjectOutputSream的writeStreamHeader()方法。在反序列化的while循环中,每次都创建一个新的ObjectInputStream用来读取header
public class SerializableDemo03{
public static void main(String[] args) throws Exception {
File file = new File(".\\c.txt");
Person p = new Person("lisi",19);
set(file,p);
List<Person> list = get(file);
for(Person per:list){
System.out.println(per);
}
}
public static void set(File file,Person p) throws Exception{
FileOutputStream fos = new FileOutputStream(file,true);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.close();
}
public static List<Person> get(File file) throws Exception{
List<Person> list = new ArrayList<Person>();
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = null;
while(fis.available()>0){
//每次都new一个新的ObjectInputStream
ois = new ObjectInputStream(fis);
Person p = (Person) ois.readObject();
list.add(p);
}
ois.close();
return list;
}
}
ObjectInputStream java.io.StreamCorruptedException: invalid type code: AC问题解决的更多相关文章
- java.io.StreamCorruptedException: invalid type code: AC错误的解决方法
问题描述: 在向一个文件写入可序列化对象时,每次只想向文件的末尾添加一个可序列化的对象,于是使用了FileOutputStream(文件名,true)间接的构建了ObjectOutputStream流 ...
- 对象反序列化时,抛出java.io.StreamCorruptedException: invalid type code: AC异常
问题描述:在使用java.io.ObjectInputStream类的readObject()方法去读取包含有序列化了多个(两个及两个以上)类的文件时,当读取到第二个类时,会抛出题目中提到的异常. 原 ...
- java.io.StreamCorruptedException: invalid stream header: EFBFBDEF 问题解决
错误方式 @Test public void testDeserializeTest() throws IOException, ClassNotFoundException { ByteArrayO ...
- java.io.StreamCorruptedException: invalid stream header: 00000000
Caused by: java.io.StreamCorruptedException: invalid stream header: 00000000 at java.io.ObjectInputS ...
- java——解决"java.io.StreamCorruptedException: invalid stream header: xxx"
这个错误是由序列化引起的,可能的原因以及解决方法: 1.kryo对于集合(比如 Map)的反序列化会失效,报这个错误,解决办法比较暴力,不用kryo了,直接用java原生方法. 2.使用Java原生方 ...
- mockito 异常Reason: java.io.IOException: invalid constant type: 18
原因: mockito内部使用的javassit的版本不一致导致的,修改为一直版本即可. 异常内容: /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jd ...
- Caused by: java.lang.RuntimeException: java.io.IOException: invalid constant type: 18
工程启动的时候有报下面这个错误的,更新下工程的jar包依赖,然后在工程的pom文件里加上下面的jar包 Caused by: java.lang.RuntimeException: java.io.I ...
- 运行报错:java.io.IOException: invalid constant type: 15
jdk,tomcat更新到jdk1.8与 tomcat8 运行报错:java.io.IOException: invalid constant type: 15 pom.xml文件中更新javassi ...
- java.lang.RuntimeException: java.io.IOException: invalid constant type: 15
java.lang.RuntimeException: java.io.IOException: invalid constant type: 15 controller通过dubbo调用servic ...
随机推荐
- 编写Java程序,实现对兵营类的封装,将兵营类中的所有属性设置为私有访问权限,方法设置为公有访问权限
返回本章节 返回作业目录 需求说明: 实现对兵营类的封装 将兵营类中的所有属性设置为私有访问权限. 将兵营类中所有属性的赋值方法设置为公有访问权限. 要求兵营名称的长度在4-8位之间. 要求兵营士兵的 ...
- 云南农业职业技术学院 / 互联网技术学院官网 HTML5+CSS3
HTML学完后写了,有小组成员参与开发,我只写了主页,那就只贴主页的代码出来了. 作为初学者,代码写得不太好,写博客纯属记录!有问题望指导! 码云开源仓库地址:https://gitee.com/yn ...
- UML的定义和组成详细介绍
目录 1.UML 1.1概述 1.2 UML是一种建模语言 1.3 UML语言包含三方面 2.UML支持软件体系结构建模 2.1 逻辑视图 2.2 实现(开发)视图 2.3 部署视图 2.4 过程视图 ...
- SpringBoot集成MyBatis-Plus自定义SQL
1.说明 本文介绍Spring Boot集成MyBatis-Plus框架后, 基于已经创建好的Spring Boot工程, 添加自定义的SQL实现复杂查询等操作. 自定义SQL主要有两种方式, 一种是 ...
- yum方式安装nginx
1.添加CentOS 7 Nginx yum资源库 [root@localhost ~]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPM ...
- android studio 获取 SHA1 值
1. 生成密钥文件 2.找到控制台 输入指令 cd c: cd C:\Users\[当前登录的用户文件夹]\.android 如 cd C:\Users\cenxi\.android 就是这里 然后输 ...
- vue js格式化数字为金额格式
/** * @description 格式化金额 * @param number:要格式化的数字 * @param decimals:保留几位小数 默认0位 * @param decPoint:小数点 ...
- layui type:2 iframe子页面向父页面传值
需求: 选择子页面表格中的radio或者双击该行,得到的该行数据传到父页面,由父页面渲染. 网上的各种方法都用了,父页面就是获取不到子页面传的值,过了一晚上,睡了一觉,柳暗花明又一村. layui t ...
- POJ2115C Looooops
http://poj.org/problem?id=2115 k位储存特点,一旦溢出,那么就到第二个循环开始返回0重新计数.问题实际转化成a+cx=b(mod 2^k)跑多少圈能够重合.因为是k位无符 ...
- HDU 2018 母牛的故事 (递归入门)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2018 思路分析: 问题分析:这道题的递推关系非常类似斐波那契数列,由题意不难得到以下函数递推式: 对于 ...