早上起來把平臺上的作業完成,最後一題是將對象寫入文件再從文件中讀取對象,開始用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();//創建文件