java.io.StreamCorruptedException: invalid type code: AC

来源:互联网 发布:设计二维码的软件 编辑:程序博客网 时间:2024/05/27 08:14

在使用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: ACat 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


原创粉丝点击