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<Student> 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<stuList.size();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();
		}
		
	}

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

你可能感兴趣的:(错题本)