3

java.io.InputStreamストリームの先頭から複数回読み取ろうとしています。

明らかに、に戻るストリームのtrue場合、markSupported()試して使用してから、ストリームを最初から再度読み取ることができます。mark(availableBytes)reset()

ほとんどのストリームはマークをサポートしておらず、マークをサポートしているもの (たとえばjava.io.BufferedInputStream) 一時的なバイト配列にデータをコピーしますが、これはメモリ消費などの点で適切ではありません。

メソッドがパラメーターとして受け取った場合、java.io.InputStreamそれを閉じてから再度開いて、同じ元のストリームを一番上にリセットして、再度読み取ることができますか?

InputStream元のファイルをメモリ (yak!) または一時ファイルに書き込む以外に、このトリックを実行する方法を見つけることができませんでしInputStreamた。ストリームをもう一度上から読み取る必要がある場合は、それらの一時的な場所に新しいファイルを開きます。

4

1 に答える 1

3

それを閉じることはできますが、どこかにデータの明示的なコピーを作成せずに同じストリームを同じデータに再度開く唯一の方法は、処理している具体的なタイプInputStream(簡単)、そのストリームがポイントするように初期化されたものを判別することです(ストリームタイプとそのインターフェイスに応じて、簡単、難しい、または不可能な場合があります)次に、元のソース入力を使用して具象ストリームタイプの新しいインスタンスをインスタンス化するコードを追加します(難しくはありませんが、保守性が低く、簡単に壊れることもあります)誰かがInputStreamあなたが処理する方法を知らないカスタム実装を作成した場合)。

于 2011-04-13T01:16:31.603 に答える