天天看點

我的Java開發學習之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号對象報java.io.EOFException異常的解決方法 判斷ObjectInputStream是否讀到檔案末尾,檔案長度未知 判斷ObjectInputStream是否讀到檔案末尾,檔案長度未知 判斷ObjectInputStream是否讀到檔案末尾,檔案長度未知

今天用ObjectOutputStream和ObjectInputStream進行對象序列化話操作的時候,報了java.io.EOFException異常。

異常代碼如下:

這個異常是因為我使用ObjectInputStream讀取對象時候,沒有判斷好ObjectInputStream是否讀取到了未知長度的檔案末尾,導緻到了檔案末尾,程式無法正常讀取檔案内容。

我的Java開發學習之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号對象報java.io.EOFException異常的解決方法 判斷ObjectInputStream是否讀到檔案末尾,檔案長度未知 判斷ObjectInputStream是否讀到檔案末尾,檔案長度未知 判斷ObjectInputStream是否讀到檔案末尾,檔案長度未知

後來研究了一下以後,得出三種解救思路:

第一種方法:

在寫完對象後,加一句 oos.writeObject(null);  插入null是用來判斷是否讀取到結尾。oos是ObjectOutputStream執行個體。

  然後讀對象的時候,使用while ((obj = ois.readObject()) != null),來判斷再次讀取一個對象,判定對象是否是空,如果不為null繼續讀取,如果為null停止讀取。

第二種方法:

将若幹個對象(數量不定)都裝入 一個容器中(如:ArrayList之類的),然後寫對象的時候,将該容器寫入。

讀取的時候,讀取出容器,然後再周遊容器,取出自己所需的對象。

第三個方法:

和第二個方法類似,将對象都存入數組中,然後寫入數組對象。

讀取的時候,取出數組,再周遊數組,取出所需的對象。

下面是具體的代碼操作:

1、要進行序列号的對象  Person.java

2、寫入對象的三種方法    

3、讀取對象的三種方法    

下面是結果:

寫入對象後,在src同級目錄下,生成3個檔案,分别是object.txt 、objectByArray.txt、objectByList.txt   如下圖所示。

我的Java開發學習之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号對象報java.io.EOFException異常的解決方法 判斷ObjectInputStream是否讀到檔案末尾,檔案長度未知 判斷ObjectInputStream是否讀到檔案末尾,檔案長度未知 判斷ObjectInputStream是否讀到檔案末尾,檔案長度未知

讀取對象,結果如下:

我的Java開發學習之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号對象報java.io.EOFException異常的解決方法 判斷ObjectInputStream是否讀到檔案末尾,檔案長度未知 判斷ObjectInputStream是否讀到檔案末尾,檔案長度未知 判斷ObjectInputStream是否讀到檔案末尾,檔案長度未知

==================================================================================================

  作者:歐陽鵬  歡迎轉載,與人分享是進步的源泉!