Java ac异常_java.io.StreamCorruptedException: invalid type code: AC异常处理

一、复习java到io操作,在使用ObjectInputStream,ObjectOutputStream进行对象的传输时遇到的这个异常,之所以出现这个异常是因为在使用了

/** true表示下次书写可追加在原有数据后 */

FileOutputStream fileOutputStream = new FileOutputStream(fileName, true);这个的原因,在读取数据的时候第一次会正常读取,不会报错,当读取第二次的时候,就会报出java.io.StreamCorruptedException: invalid type code: AC的错误。

二、原因是:用FileOutputStream(fileName, true)向同一个文件中序列化对象,每次都会向文件中序列化一个header。在反序列化的时候每个 ObjectInputStream 对象只会读取一个header,那么当遇到第二个的时候就会报错,导致出现异常。

解决方法主要是重写了ObjectOutputStream的writedStreamHeader,使得在第一次写文件的时候可以写入文件Header,当判断文件不是第一次写的使用则不写文件Header.

代码如下:

package com.feilonkji.one;

import java.io.IOException;

import java.io.ObjectOutputStream;

import java.io.OutputStream;

/**

*

* @ClassName: MyObjectOutputStream

* @Description: TODO 解决追加重写重复写文件头的问题

* @author zr

* @date 2020年4月15日

* @version V1.8

*/

public class MyObjectOutputStream extends ObjectOutputStream {

protected MyObjectOutputStream() throws IOException, SecurityException {

super();

// TODO Auto-generated constructor stub

}

public MyObjectOutputStream(OutputStream out) throws IOException {

/**重写调用ObjectOutputStream流*/

super(out);

}

/**

* 重写 写文件头的方法

* 如果是第一次输入则写文件头,不是第一次输入则不写文件头

*/

@Override

protected void writeStreamHeader() throws IOException {

// TODO Auto-generated method stub

return;

}

}

写方法:

/**

*

* Title: writeObject

* Description: 写入对象到指定的文件中

* @param stuList 集合对象

* @param fileName 文件的全路径地址

*/

public void writeObject(List stuList,String fileName) {

/**检查是否存在这个文件*/

isExistFileName(fileName);

/** 遍历集合中的元素,写入到文件中 */

try {

/** true表示下次书写可追加在原有数据后 */

FileOutputStream fileOutputStream = new FileOutputStream(fileName, true);

/**判断文件是否是第一次写入*/

if (checkFileLength(fileName)) {

/**不是第一次写入,调用自定义写入流,不写文件Header*/

myObjectOutputStream = new MyObjectOutputStream(fileOutputStream);

/**遍历集合写对象到文件*/

for (Student list : stuList) {

myObjectOutputStream.writeObject(list);

}

} else {

/**第一次写入*/

output = new ObjectOutputStream(fileOutputStream);

output.writeObject(stuList.get(0));

output.close();

myObjectOutputStream = new MyObjectOutputStream(fileOutputStream);

for(int a=1;a

myObjectOutputStream.writeObject(stuList.get(a));

}

}

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

由此在读取的时候第二次读取也不会再报此异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值