文件写入对象

来源:互联网 发布:移动adhoc网络的特点 编辑:程序博客网 时间:2024/06/14 06:27

早上起来把平台上的作业完成,最后一题是将对象写入文件再从文件中读取对象,开始用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();//创建文件