0

、、、、など、さまざまな方法でJavaにデータを保存する必要がありましたFile。そして、3つのメソッドがほぼ同じことを実行することになりました。そこで、パラメーターとしてを使用して、それらを単一のメソッドに変更しました。単一のOutputStreamにいくつかのことを書きました。たとえば、テキスト、シリアル化されたオブジェクト、別のシリアル化されたオブジェクト、数値データなどです。StringSystem.outOutputStream

しかし今、私は立ち往生しています。書かれていることを区別できないという事実を見落としていました。データ用にを作成しInputStreamます。Scannerそのストリームで最初にテキストを読み取るためにを使用し、次にObjectInputStreamを使用してシリアル化されたオブジェクトを読み取ろうとしましたが、。を取得しEOFExceptionます。

スキャナーが先読みしていると思います。スキャナーが先読みしないようにするにはどうすればよいですか。
むしろ、それぞれに適切なInputStreamを使用して、データの各グループを読み取るにはどうすればよいですか。

4

1 に答える 1

2

同じストリームから読み取るために別のリーダーを使用してみたくはありません。マシン上で動作させることができたとしても、別のOSまたは別のJVM実装で実行すると、機能しなくなる可能性があります。

データの読み取りと書き込みの単一の方法を選択する必要があります。ストリームでシリアル化されたオブジェクトを使用しているので、おそらくすべてにそれを使用するのが最善です。あなたはすでにコメントの中で、文字列を介してバイナリデータを読み込んで正しく解釈するのは非常に難しいと指摘しました。ただし、Stringオブジェクトを取得し、それを出力ストリームに書き出し、それを読み戻してStringとしてキャストすることは難しくありません。

ここで、データの解釈に問題があります。すべてをタグとデータのペアで書き出すことをお勧めします。最初に整数を書き出し(プログラムで使いやすくするために列挙型の序数かもしれません)、次にデータを書き出します。整数は、ストリームで次に来るデータのタイプ(たとえば、テキストまたはオブジェクト)を表し、次に読み込むオブジェクトはデータであり、それがどのタイプであるかがわかります。テキストの場合は、オブジェクトを文字列にキャストしてスキャナーに渡すことができます。オブジェクトの場合は、オブジェクトで必要なことをすべて実行できます。

物事を少しすっきりさせるために、各データ型のメソッドを使用してストリームのラッパーを作成できます。多分あなたはgetNextObject()方法と方法を持つことができますgetNextTextScanner() 。それぞれが最初にストリーム内の次の整数タグをチェックして、正しいデータを読み取っていることを確認し(不一致が見つかった場合は例外をスローします)、次に次のオブジェクトを返すか、データの文字列を処理するための新しいスキャナーを返します。

実際には、2つの異なるタイプのデータに別々のストリームを使用できるとよいでしょう。しかし、あなたが本当に同じストリームを使用して立ち往生しているなら、それは私がそれをする方法です。

于 2012-08-24T15:46:51.023 に答える