Java对象序列化追加的问题,以及Java的读取多个对象的问题解决方法。

来源:互联网 发布:红楼梦解析知乎 编辑:程序博客网 时间:2024/06/14 08:34

本文分两段,上端自己写的,下端网上别人写的


public class SerializableTest1
{
    
    /**
     * 保存为一个二进制的文件
     */
    public static void main(String[] args) throws Exception
    {
        Person p1 = new Person(20,"张三",33.4);
        Person p2 = new Person(50,"李四",53.4);
        Person p3 = new Person(10,"王五",123.4);

        //存入序列化的对象
        FileOutputStream fos = new FileOutputStream("person.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
    
        oos.writeObject(p1);
        oos.writeObject(p2);
        oos.writeObject(p3);
    
        oos.close();
    
    ///////////////////////////////////////////////////////
    
        //取出序列化的对象
        FileInputStream fn = new FileInputStream("person.txt");
        ObjectInputStream ois = new ObjectInputStream(fn);
    
        while(fn.available() > 0)    //代表文件中还有内容
        {
            Person p = (Person)ois.readObject();
            System.out.println(p);
        }
 
    }
}



class Person implements Serializable
{
    String name;
    
    int age;
    
//    transient int age;    //此属性不可序列化
    
    double height;
    
    public Person(int age, String name, double height)
    {
        this.age = age;
        this.name = name;
        this.height = height;
    }
    
    public String toString()
    {
    return this.name + "," +this.age + "," + this.height;
    }
    
}


//////////////////////////////////////////////////////////////////////////////////////////////////


为尊重原创作者,贴出原始地址:


http://www.cnblogs.com/liaoweipeng/p/4474680.html


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


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();
       }


------------------------------------------------------------------------------------------------


往下为本人所写





本文出自 “编程路上的小菜鸟” 博客,请务必保留此出处http://vista5550.blog.51cto.com/5883826/1743848

0 0
原创粉丝点击