【转】解决ObjectOutputStream连续…

转自: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连续写入对象不能全读出问题


    在用下方法连续读两个存进的对象时

          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连续写入对象不能全读出问题

     

     可以看到差别表面上差别不大

     但确实第一种存的文件能把所有的对象读出来

 

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值