java.io.StreamCorruptedException: invalid type code: AC

在使用ObjectInputStream和ObjectOutputStream的时候,可能会遇到这个错误,我们先看一下这个错误是怎么发生的:

package org.ygy.oos;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class FileUtil {
	public static final String FILE_PATH = "data.txt";
	
	/**
	 * 将一个Person对象写入文件
	 * @param p
	 */
	public static void writeOne(Person p) {
		ObjectOutputStream oos = null;
		try {
			oos = new ObjectOutputStream(new FileOutputStream(FILE_PATH , true));
			oos.writeObject(p);
			oos.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if(oos != null) {
					oos.close();
					oos = null;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 读取文件,并输出保存的对象
	 */
	public static void read() {
		ObjectInputStream ois = null;
		try {
			ois = new ObjectInputStream(new FileInputStream("data.txt"));
			Person p = (Person) ois.readObject();
			System.out.println("p->" + p);
			
			Person p2 = (Person) ois.readObject();
			System.out.println("p2->" + p2);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				if(ois != null) {
					ois.close();
					ois = null;
					
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		writeOne(new Person(1002 , "索隆"));
		read();
	}
}

其实,就是使用ObjectoutputStream采用追加方式写入对象的时候,出现的问题。

1.当你在文件中只写入一个对象的时候,也只读取一次的话,是很正常的。

2.当你在文件中写入一个对象,又采用追加的方式写入第二个对象的时候,读取两次,并输出对象,就会发生错误:

p->Person [id=1001, name=路飞]
java.io.StreamCorruptedException: invalid type code: AC
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1374)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
	at org.ygy.oos.FileUtil.read(FileUtil.java:49)
	at org.ygy.oos.FileUtil.main(FileUtil.java:72)

3.如果你的文件只打开一次,写入两个对象,读取两次,也是没有问题的。

经过测试,会发现,文件打开一次,正确;文件打开两次,错误。

用这两种方法生成的文件,比较之后,他们的内容是不一样的,猜测:ObjectOutputStream在文件关闭的时候,会写入一些东西。

在网上看到一篇博客,讲的不错,看一下:

http://halzhang.iteye.com/blog/267917


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值