2011-04-04 26 views
2

我發現this page,建議循環,直到引發異常,然後處理該異常。如何很好地從java.io.ObjectInputStream中讀取未知數量的對象?

基本上它表明的是:

[...] 
try { 
    while (true) { 
     objectInputStream.readObject(); 
    } 
} 
catch (EOFException e) { 
    \\ This ALWAYS happens 
} 
[...] 

然而,由於布洛赫把它有效的Java,一個只能「用於特殊情況例外」並沒有真的什麼特殊的約不包含InputStream的無限數量的對象現在在那裏?這將發生在每一次!

由於ObjectInputStream中沒有hasNext方法,我該怎麼辦?我真的堅持使用Exception來知道什麼時候沒有更多的對象可供閱讀?

+0

將它們全部放入單個數組/ List列表中並一次讀取? (數組和'List'在這裏都有問題(引用數組通常是不好的,泛型對象作爲具有反序列化的根是好的),所以可能最好的方法是對一個「自定義」有意義的對象進行反序列化。) – 2011-04-04 12:25:31

+0

是的,但不是我不想將文件的全部內容同時保存在內存中...... – jonalv 2011-04-04 12:29:30

+0

由於反向引用,它們將在內存中。 ('readUnshared'也不太可能幫助你。) – 2011-04-04 12:58:22

回答

9

許多方法可以做到這一點,所有的人都很好,在我看來:

  • 使用異常。正如你所說,API設計者沒有包含一個方法來檢查是否有更多的方法,所以這是部分錯誤

  • 在寫入流時使用標記對象。例如Integer.MAX_VALUE或自定義的EOFMarker對象。如果發現,停止。

  • 請勿自行寫入對象,而應改爲編寫List。然後閱讀清單

+0

第三種選擇對我來說不是一種選擇,因爲我需要將文件寫入文件,因爲我無法將它們保存在內存中,並且爲了編寫我需要的列表以保持內存中的列表... 我真的很喜歡第二個變種:) – jonalv 2011-04-04 12:17:57

+0

我會去最後一次。例外情況可能來自任何地方,任何情況都可能表明,例如截斷的數據。如果我打算使用標記對象,我想我會使用一個爲特定目的而製作的對象(可能是一個枚舉實例)。 – 2011-04-04 12:29:07

+0

@Tom是的,我只是增加了'EOFMarker'作爲'MAX_VALUE'的替代方案。 – Bozho 2011-04-04 12:30:18