2011-04-04 13 views
2

this pageは、例外がスローされるまでループし、その例外を処理することを示唆しています。java.io.ObjectInputStreamから不明な数のオブジェクトをうまく読み込む方法を教えてください。

は、基本的にはどのようなことが示唆している:ブロッホは、効果的なJavaでそれを置くよう

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

しかし、一つは唯一の「例外条件の例外を使用する」必要があるとのInputStreamを含有しない程度の例外は何が本当にありませんオブジェクトの無限の数は今そこにありますか?それは毎回起こるでしょう!

ObjectInputStreamにはhasNextメソッドがないため、何ができますか?私は本当に読み込み可能なオブジェクトがなくなった時を知るためにExceptionを使うことに固執していますか?

+0

それらをすべて1つの配列/ 'List'に入れ、それを一読しますか? (配列と 'List'の両方に問題があります(参照配列は一般的に悪いですが、一般的なオブジェクトはデシリアライゼーションの根として良いです)、おそらく"カスタム "の意味のあるオブジェクトをデシリアライズするのが最も良いでしょう) –

+0

しかし、同じ時間にファイルの内容全体をメモリに保持することができます... – jonalv

+0

これらのファイルは、逆参照のためにメモリに格納されます。 ( 'readUnshared'は実際にあなたを助けることはほとんどありません。) –

答えて

9

私の意見では、これを行うための方法、それらのすべての罰金、数:

  • は例外を使用しています。あなたが言ったように、APIデザイナーには、それ以上のものがあるかどうかをチェックするメソッドは含まれていないため、部分的にエラーが発生しています。

  • ストリームに書き込むときにマーカーオブジェクトを使用します。例えば、Integer.MAX_VALUEまたはカスタムEOFMarkerオブジェクトです。見つかった場合は停止します。

  • 代わりにオブジェクトを書き込むのではなく、Listと記述してください。その後、リストを読む

+0

3番目の選択肢は私にとっての選択肢ではありません。なぜなら、私はそれらを記憶しておくことができず、必要なリストを書くためにファイルに書き込む必要があるからですメモリ内のリストを維持する... 私は2番目の変種が本当に好きです:) – jonalv

+0

私は最後に行くつもりです。例外はどこからでも来る可能性があり、切り捨てられたデータを示している可能性があります。マーカーオブジェクトを使用する場合、特定の目的のために作成されたオブジェクト(おそらくenumインスタンス)を使用すると思います。 –

+0

@Tom yeah、私は 'MAX_VALUE'の代わりに' EOFMarker'を追加しました – Bozho

関連する問題