关于java对象流如何追加对象总结

做课程设计,卡在这里卡了一天,太难了,经过无数的百度,博客等等等等,还好是解决了,总结一下
注意: 当我们使用对象流的时候,我们向文件中写入或者是读出都是用的序列化对象,而序列化对象在写入文件时,系统会自动添加aced 0005的一个头部,并且占4个字节,这个我在网上看到的,经过验证确实如此。
解决: 我们只需要在写入文件的时候判断该文件是否已经存在,或者说是否已经写入过对象了,如果写入过对象,我们把前面那个4个字节去掉在写入到文件里就OK了
上代码(Recording是一个序列化的类,自己随便弄个类验证即可)

import java.io.*;

public class test {
    public static void main(String args[]) {
        File file = new File("text.txt");
        Recording r[] = new Recording[10];
        boolean isexist = false;//定义一个用来判断文件是否需要截掉头aced 0005的
        try {
            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(new Recording("小明", "锡纸烫", 388, "李四", "10.23"));//进行序列化   
                oos.close();
            } else {//文件不存在
                file.createNewFile();
                FileOutputStream fo = new FileOutputStream(file);
                ObjectOutputStream wr1 = new ObjectOutputStream(fo);
                wr1.writeObject(new Recording("小花", "纹理烫", 288, "张三", "10.23"));
                wr1.writeObject(new Recording("小明", "锡纸烫", 388, "李四", "10.23"));
                wr1.writeObject(new Recording("小刚", "洗发", 18, "张三", "10.23"));
                wr1.writeObject(new Recording("小强", "洗发", 18, "张三", "10.23"));
                wr1.writeObject(new Recording("小明", "洗发", 18, "张三", "10.23"));
                wr1.close(); // 写入操作完成
            }
            FileInputStream in = new FileInputStream(file);
            ObjectInputStream re = new ObjectInputStream(in);
            Recording test = null;
            while ((test = (Recording) re.readObject()) != null) {
                System.out.println(test.name);
            }
            re.close();
        } catch (IOException e) {
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值