下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

Java读取多个对象的问题

作者:课课家教育     来源: http://www.kokojia.com点击数:912发布时间: 2016-03-08 11:47:47

标签: java对象java读取java序列化

大神带你学编程,欢迎选课

  这几天做一个小的聊天项目用到对象序列化的知识,发现对象序列化不能像普通文件一样直接追加对象。每次写入对象都会被覆盖。弄了2个多小时终于解决了。java默认的对象序列化是每次写入对象都会写入一点头aced 0005(占4个字节),然后每次读取都读完头然后在读内容。解决方法就是先判断文件是否存在。如果不存在,就先创建文件。然后写了第一个对象,也写入了头aced 0005。追加的情况就是当判断文件存在时,把那个4个字节的头aced 0005截取掉,然后在把对象写入到文件。这样就实现了对象序列化的追加。代码如下

Java读取多个对象的问题_java对象_java序列化_课课家

  String filename=m.getGetter()+m.getSender();

  File file=new File("D:\\\\"+filename+".txt");

  if(file.exists()){

  isexist=true;

  FileOutputStream fo=new FileOutputStream(file,true);

  ObjectOutputStream oos = new ObjectOutputStream(fo);

  long pos=0;

  if(isexist){

  pos=fo.getChannel().position()-4;

  fo.getChannel().truncate(pos);

  }

  oos.writeObject(m);//进行序列化

  }else{//文件不存在

  file.createNewFile();

  FileOutputStream fo=new FileOutputStream(file);

  ObjectOutputStream oos = new ObjectOutputStream(fo);

  oos.writeObject(m);//进行序列化

  }

  下面是系列化的实现。注意要在循环外面关闭流,在里面关闭会出现句柄无效的错误。

  String fileName=owner+friendNo;

  File file = new File("D:"+File.separator+fileName+".txt");

  if(file.exists()){

  ObjectInputStream ois;

  try {

  FileInputStream fn=new FileInputStream(file);

  ois = new ObjectInputStream(fn);

  while(fn.available()>0){//代表文件还有内容

  Message p = (Message)ois.reADObject();//从流中读取对象

  System.out.println(p.getCon);

  }

  ois.close();//注意在循环外面关闭

  } catch (Exception e1) {

  // TODO Auto-generated catch block

  e1.printStackTrace();

  }

赞(23)
踩(3)
分享到:
华为认证网络工程师 HCIE直播课视频教程