Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 487|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-29 17:05:43 | 显示全部楼层 |阅读模式

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

             首先我们要写一个对类,用于对象的序列化,这个类实现了Serializable接口。类的定义如下:

             

           

    package qq.client.tools;
    
    import java.io.*;
    /**
     * 这是对象序列化的程序
     * 实现了对象序列化的追加
     * @author Administrator
     *
     */
    
    public class ObjectOutputTest {
    
        /**
         * @param args
         * @throws Exception 
         */
        public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
                Message m = new Message();
                m.setName("aaaaaaaaaaaaaaaaaaaaa");
                File file=new File("D:\\jjm.txt");
                boolean isexist=false;//定义一个用来判断文件是否需要截掉头aced 0005的
                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;//追加的时候去掉头部aced 0005
                                fo.getChannel().truncate(pos);
                                   }
                                oos.writeObject(m);//进行序列化    
                                System.out.println("追加成功");
                  }else{//文件不存在
                     file.createNewFile();
                     FileOutputStream fo=new FileOutputStream(file);
                     ObjectOutputStream oos = new ObjectOutputStream(fo);
                     oos.writeObject(m);//进行序列化
                     oos.close();
                     System.out.println("首次对象序列化成功!");
                  }
        }
    
    }

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

             

    package qq.client.tools;
    
    import java.io.*;
    
    public class ObjectInputTest {
    
    	/**这是反序列化的程序
    	 * 实现从文件读取多个对象
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
              File file = new File("D:"+File.separator+"jjm.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.getName());
    
                   }
    
                    ois.close();//注意在循环外面关闭
                  } catch (Exception e1) {
                  // TODO Auto-generated catch block
                 e1.printStackTrace();
                  }
              }
    	}
    }
    

      整个序列化对象的追加与从文件读取多个对象实就实现了。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-4 10:05 , Processed in 0.058351 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表