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