0

ファイルに複数のオブジェクトが保存されています。これは ObjectInputStream に関するものです。以下のコードがある場合:

FileInputStream fis = new FileInputStream(filename);

ObjectInputStream ois = new ObjectInputStream(fis);

Object obj1 = (Object)ois.readObject();

ois.close();
 ois = new ObjectInputStream(fis);

Object obj2 = (Object)ois.readObject();

私の質問は: 2 番目のオブジェクト ストリーム (obj2) から呼び出された readObject は、ファイル内の 1 番目または 2 番目のオブジェクトになりますか?

4

2 に答える 2

3

実際、例外がスローされます。ObjectInputStream で close を呼び出すと、FileInputStream も閉じます。

于 2011-06-16T22:05:50.223 に答える
0

オブジェクトの保管方法によって異なります。単一の ObjectOutputStream を使用した場合は、単一の ObjectInputStream も使用することをお勧めします。

出力に別のストリームを使用した場合は、入力にも別のストリームを使用する必要があります。しかし、これはあまりお勧めできません。


「永続キュー」については、次のようなものをお勧めします。

送信側:

  • ByteArrayOutputStream を作成し、その周りに ObjectOutputStream をラップします。
  • オブジェクトを OOS に書き込み、OOS を閉じます。
  • を取得しbyte[]、長さを示すヘッダーと一緒にキュー ストリームに書き込みます。

受信側:

  • キュー ストリームからヘッダー長を読み取ります。
  • byte[]指定された長さのa をキュー ストリームから読み取ります。
  • この配列から ByteArrayInputStream を作成し、その周りに ObjectInputStream をラップします。
  • OIS から 1 つのオブジェクトを読み取り、OIS を閉じます。

キューの一部を保存するときは、必ずメッセージ全体 (つまり、オブジェクトと一緒にヘッダー) を保存してください。

もちろん、JMS (ObjectMessage を作成してキューに送信する) などの既存のソリューションを使用する方が簡単な場合があります。

于 2011-06-16T23:39:33.587 に答える