0

理解できない奇妙な OptionalDataException を扱っています。

入ってくるオブジェクトがあります。これらのオブジェクトは、を装飾してそのメソッドOutputObjectStreamを呼び出すことによってそれらを書き込むクラスによってディスクに保存されます。writeUnshared定期的に、10000 オブジェクトごとにflushand を呼び出しますreset。最後に、ストリームを閉じます。

このようにして、シリアル化されたオブジェクトのみを含む少数のファイルを作成します。

つまりね。これらのファイルがすべて書き込まれた後、ペアを取り、マージソートを試みます。この時点では、ファイルのサイズは変更されていません (予想どおり)。

これを行うには、まず 2 つのストリームを開きreadObject、それぞれを呼び出します。

ただし、このreadObject(各ストリームの最初のもの)への呼び出しはOptionalDataException、毎回 をスローしeof = false, length = 4ます。これは、私が理解しているように、プリミティブ データ型を読み取っていること、または取得していない何かが起こっていることを示しています。

4

1 に答える 1

0

OK、これを共有する必要があります。

私が言ったように、reset定期的に呼び出すためにシリアル化されたオブジェクトの量をカウントする ObjectOutputStream のラッパーを作成しました。

問題はそのクラスのコンストラクターにあり、基本的には次のとおりです。

class CustomObjectOutputStream extends ObjectOutputStream {

    private int flushBoundary;

    CustomObjectOutputStream(ObjectOutputStream oos, int flushLimit){
               super(oos);
               ...
     }
   //other methods
}

さて、javadocページをよく見ると、

指定された OutputStream に書き込む ObjectOutputStream を作成します。このコンストラクターは、シリアライゼーション ストリーム ヘッダーを基になるストリームに書き込みます。呼び出し元は、ヘッダーを読み取るときに ObjectInputStreams を受け取るためのコンストラクターがブロックされないように、ストリームをすぐにフラッシュしたい場合があります。

ファイルの先頭に「余分なもの」があったことを意味します。super() 呼び出しをデフォルトのものに変更したところ、OptionalDataExceptions が消えました。

于 2013-10-15T22:36:06.350 に答える