转自:http://wenku.baidu.com/link?url=Z38XGYCGGWI14-lPP3T1TwjvHYEzHX0f5LcU7jRkzBwBMznm-usuIO8ba4h-7j2t3vtjzQM1ooYlpGU2HScHtjRFPxv6741Wz__ArS89K7e
如果是这样构建
ObjectOutputStream oos = new ObjectOutputStream(new FileOuputStream("文件地址"), true);
这样的话..写对象就是加在原来的后面..
如果没有加那个true的话..默认就是会覆盖之前的内容..
用ObjectOutputStream向一个文件保存对象时
方法一:
Students1 = newStudent(newDate(),"Wangshao",182, "3");
Student s2 =newStudent(newDate(),"Yaoyuan",168, "1");
ObjectOutputStream oos= newObjectOutputStream(newFileOutputStream("f:/hello3.object",true));
oos.writeObject(s1);
oos.writeObject(s2);
oos.close();
方法二:
publicstaticvoidmain(String[]args) throwsException{
Student s1 =newStudent(newDate(),"Wangshao",182, "3");
write(s1);
Student s2 =newStudent(newDate(),"Yaoyuan",168, "1");
write(s2);
}
publicstaticvoidwrite(Students) throwsException{
ObjectOutputStream oos= newObjectOutputStream(newFileOutputStream("f:/hello2.object",true));
oos.writeObject(s);
oos.close();
}
文件中的内容对比:
方法一结果: 方法二结果:
![【转】解决ObjectOutputStream连续写入对象不能全读出问题 【转】解决ObjectOutputStream连续写入对象不能全读出问题](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
在用下方法连续读两个存进的对象时
ObjectInputStreamois = newObjectInputStream(newFileInputStream(
"f:/hello3.object"));
Student s = (Student)ois.readObject();
System.out.println(s);
Student s1 = (Student)ois.readObject();
System.out.println(s1);
方法一存的文件能读成功,方法二保存的文件只能读取出一个,第二个出现StreamCorruptedException异常。
(想要实现连续追加,再追加,需要重写writeObject(Objectobj)把追加标识的部分删掉)
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.io.OutputStream;
importjava.util.Date;
publicclass TestObjectStream {
publicstatic void main(String[] args) throws Exception {
writeObject();
// readObject();
}
//写对象到一个文件, 对象-->字符数组Object流升级了Data流(不是继承),可已实现Data流的功能
publicstatic void writeObject() throws Exception {
Person p = new Person("wangshao", new Date(), 183);
MyObjectOutputStream myStream =MyObjectOutputStream.getInstance(new File("f:/hello.txt"),true);
myStream.writeObject(p);
myStream.close();
}
publicstatic void writeObject2() throws Exception {
Person p = new Person("Wangshao", new Date(), 183);
ObjectOutputStream oos = new ObjectOutputStream(newFileOutputStream("f:/hello4.txt",true));
oos.writeObject(p);
oos.close();
}
//读出一个对象
publicstatic void readObject() throws Exception {
ObjectInputStream ois = new ObjectInputStream(newFileInputStream("f:/hello.txt"));
Person p = (Person)ois.readObject();
Person p1 = (Person)ois.readObject();
Person p2 = (Person)ois.readObject();
Person p3 = (Person)ois.readObject();
ois.close();
System.out.println(p);
System.out.println(p1);
System.out.println(p2);
System.out.println(p3);
System.out.println(ois.available());//现在已经读到文件尾部,所以再读一次就会出错
}
}
//
classMyObjectOutputStream extends ObjectOutputStream{
staticFile f;
staticboolean _append;
privateMyObjectOutputStream(File file,boolean append) throws IOException{
super(new FileOutputStream(file,append));
}
//重写了writeStreamHeader()方法,添加了一些添加前缀的条件
@Override
protected voidwriteStreamHeader() throws IOException {
//添加前缀条件:文件不存在、文件内容为空、不追加(覆盖原内容)
if(!f.exists() || f.length()==0 || _append==false){
super.writeStreamHeader();
}else{
super.reset(); //否则,重置。
}
}
//不能通过构造函数实例化一个MyObjectOutputStream,否则会直接调用super(newFileOutputStream(file,append)),而父类这个方法包含了
//super.writeStreamHeader()方法,也就直接在要写的对象前加上了前缀,所以可以通过这个方法得到一个实例,绕过了那个判定,然后在进行判定是否在这个写对象是增加前缀
publicstatic MyObjectOutputStream getInstance(File file,booleanappend){
f=file;
_append=append;
try {
return newMyObjectOutputStream(file,append);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
结果
![【转】解决ObjectOutputStream连续写入对象不能全读出问题 【转】解决ObjectOutputStream连续写入对象不能全读出问题](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
可以看到差别表面上差别不大
但确实第一种存的文件能把所有的对象读出来