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