古詩詞大全網 - 藝術簽名 - 線程“main”java . io中出現異常。Java中出現eofexception。

線程“main”java . io中出現異常。Java中出現eofexception。

/*?

我也是學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();

}

}?

}