我也是學java的,這個問題查了很久資料,大概明白是怎麽回事了。梳理壹下思路,如下:
ObjectInputStream和ObjectOutputStream類可以讀取對象。ObjectOutputStream要求寫入的對象必須實現Serialiable接口,而ObjectInputStream用於讀取之前的對象。ObjectOutputStream?寫入的基本數據和對象被反序列化。先不說寫,讀的時候用readObject()方法。?
方法簽名:public?決賽?對象?readObject()拋出?IOException,ClassNotFoundException?圖說:什麽時候?InputStream?當中出現問題或遇到不應反序列化的類時,將引發異常。所有的異常都是對的?InputStream?都是致命的,會使它處於不確定的狀態;是忽略還是恢復流狀態取決於調用者。拋出ClassNotFoundException,InvalidClassException,StreamCorruptedException,OptionalDataException和IOExcepiton(具體可以查看api文檔),EOFExcepiton從哪裏來,找到源代碼。讀取對象-“讀取對象0-”偷看字節,順便拿代碼:(這裏是EOFException,不介意可以直接跳過)*/
字節?peekByte()?摔投?IOException?{
int?瓦爾。=?peek();
如果?(瓦爾?& lt?0)?{
扔?新的?eof exception();
}
回歸?(字節)?val
}?
/*
此時,程序拋出壹個EOFException,這意味著流已經到達了末尾,您嘗試繼續readObject操作。在這個問題中,是while(obj!=null),readObject方法的返回值為Object,未指定end時返回值為null(即不能是obj!=null確定未來是否有對象),怎麽辦?
壹開始我想到了這個類中可用的()方法,也就是while (dis。available()>;0)作為條件,結果與EOFException相同。測試後發現dis.available()方法的返回值始終為0,用ObjectOutputStream編寫的文件就是這種情況。(available()方法也有說明:Returns?那個?號碼?的?字節?那個?可以嗎?是嗎?讀書?沒有?阻擋。註意沒有?阻塞).然後呢?在網上查了壹下資料,有三種方法可以解決這個問題:
1,使用容器類存儲對象,如List、StringBuffered等。,壹次寫壹次讀,通過容器類添加修改對象。
2.在文件中多寫壹個變量,比如int?長度?用來記錄有多少對象進入,通過while(length >;0),但在文件中添加或刪除對象時應同時修改長度。
3.通過捕獲EOFExceptin(巧妙的思維)判斷已經到達文件末尾。?
下面是妳的代碼,在while()和catch(EOFException?E) Block,其他都沒變(classes School和Student2是我自己根據妳的代碼添加的,可能和妳的不壹樣)。運行結果:
學生2?[name =張撒,?id=30]
學生2?[name=mnc,?id=30]
妳已經到達文件的結尾了嗎?
*/
進口?Java . io . eof exception;
進口?Java . io . file;
進口?Java . io . file inputstream;
進口?Java . io . file output stream;
進口?Java . io . io exception;
進口?Java . io . objectinputstream;
進口?Java . io . object output stream;
進口?Java . io . random access file;
進口?Java . io . serializable;
進口?Java . util . ArrayList;
進口?Java . util . iterator;
進口?Java . util . list;
班級?學校{
私人?字符串?姓名;
公共?列表& lt學生& gt?列表;
公共?學校(字符串?姓名)?{
這個名字?=?姓名;
}
公共?列表& lt學生& gt?getAllStudents()?{
如果(列表?==?空)
列表?=?新的?ArrayList & lt學生& gt();
回歸?列表;
}
}
班級?學生2?器物?可序列化{
/**
*?
*/
私人?靜電?決賽?龍?serialVersionUID?=?1L;
私人?字符串?姓名;
私人?int?id;
公共?Student2(字符串?姓名,?int?id)?{
這個名字?=?姓名;
這個. id?=?id;
}
@覆蓋
公共?字符串?toString()?{
回歸?“學生2?[name= "?+?名字?+?",?id= "?+?id?+?"]";
}
}
公共?班級?Test01?{
公共?靜電?作廢?main(字符串?args[])?摔投?異常{
文件?f =新?file(" d:"+file . separator+" test 2 . txt ");?
//?RandomAccessFile?rdf=new?RandomAccessFile(f,“rw”);
學校?sch?=?新的?學校(“西南大學”);
學生2?s 1 =新建?Student2(“張薩”,30);
學生2?s2 =新?學生2(“MNC”,30);?
sch.getAllStudents()。添加(s 1);?
sch.getAllStudents()。添加(S2);?
叠代器& lt學生& gt?iter=sch.getAllStudents()。叠代器();
ObjectOutputStream?oos=?null?;
oos?=?新的?ObjectOutputStream(新?FileOutputStream(f))?;
while(iter.hasNext())
{
學生2?a5 = ITER . next();
oos.writeObject(a5)?;?
}?
對象?obj?=?null?;?//?接收讀取的內容
ObjectInputStream?ois?= null
試試{?
ois?=?新的?ObjectInputStream(新?FileInputStream(f))?;?//?實例化對象輸入流
While(true)//直接使用While(true)使讀取操作繼續進行。
{
obj?=?ois . read object();?//循環下列數據
system . out . println(obj);
}
}catch(EOFException?e){?//在這裏捕獲EOFException?
System.out.println("已到達文件結尾");
}catch(IOException?e){
e . printstacktrace();
}
最後{?
如果(ois!=空)
{?
ois.close()?;?//?關閉
}?
如果(oos!=空)
OOS . close();
}
}?
}