一、复习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();
}
}
由此在读取的时候第二次读取也不会再报此异常。