文件写入对象

早上起来把平台上的作业完成,最后一题是将对象写入文件再从文件中读取对象,开始用ObjectOutputStream处理流放在FileOutputStream字节流上面对对象进行写入,然后ObjectInputStream对文件进行读取,每次都只能读取第一个对象和报一个莫名其妙的错。后来将对象存入list集合里面,再把集合作为一个对象写入文件,但是这个操作有点费力,每次控制台添加信息的时候都要把之前的信息也打上去。想了又想看了又看搞不懂就去百度了...

    对象序列化不能像普通文件一样直接追加对象。每次写入对象都会被覆盖。Java默认的对象序列化是每次写入对象都会写入一点头aced 0005(占4个字节),然后每次读取都读完头然后在读内容。解决方法就是先判断文件是否存在。如果不存在,就先创建文件。然后写了第一个对象,也写入了头aced 0005。追加的情况就是当判断文件存在时,把那个4个字节的头aced 0005截取掉,然后在把对象写入到文件。

  boolean isexist = false;//定义一个用来判断文件是否需要截掉头aced 0005

        //判断文件是否存在

if(files.exists()){

    isexist = true;

//创建一个文件输出字节流

    FileOutputStream fo = new FileOutputStream(files,true);

objOut = new ObjectOutputStream(fo);//字节 流上加 对象处理流

long pos = 0;

if(isexist){

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

fo.getChannel().truncate(pos);

}

objOut.writeObject(card);//进行序列化

objOut.close();

}else{//文件不存在

files.createNewFile();//创建文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值