PipedInputStreams と PipedOutputStreams に関連するすべての質問を検索しましたが、役立つものは見つかりませんでした。うまくいけば、ここにいる誰かが似たようなものに出くわしたことでしょう。
バックグラウンド:
java.io.InputStreamからデータを読み取るクラスがあります。このクラスにはhasNext()というメソッドがあり、指定された InputStream のデータをチェックし、データが見つかった場合は true を返し、そうでない場合は false を返します。この hasNext() メソッドは他の InputStream と完全に連携しますが、PipedInputStream (別の Thread の PipedOutputStream から供給され、以下の inputSupplier 変数にカプセル化されている) を使用しようとすると、ハングします。hasNext() メソッドの仕組みを調べた後、次のコードで問題を再現しました。
public static void main(String [] args){
PipedInputStream inputSourceStream = new PipedInputStream(inputSupplier.getOutputStream());
byte[] input = new byte[4096];
int bytes_read = inputSourceStream.read(input, 0, 4096);
}
inputSupplier は、デッドロックを回避するために、ローカルの PipedOutputStream を使用して独自のスレッドで実行される、私が作成した小さなクラスの単なるインスタンスです。
問題 したがって、私の問題は、ストリームで hasNext() メソッドが PipedInputStream.read() メソッドを呼び出して、読み取るデータがあるかどうかを確認することです。これにより、読み取り対象のデータが到着するまで終了しないブロッキング読み取り操作が発生します。これは、ストリームが空の場合、関数 hasNext() が決して false を返さない (またはまったく返さない) ことを意味します。
免責事項: available() メソッドについては知っていますが、ストリームの最後にいるということではなく (Stream の実装が何であれ)、利用可能なバイトがないことだけがわかり、したがって read() はこれを確認するために必要です。
[編集]最初に PipedInputStream を使用した目的は、データの「バースト」ソースをシミュレートすることでした。つまり、散発的に書き込むことができる Stream が必要であり、 hasNext() メソッドが Stream の読み取り時に Stream に新しいデータがあることを検出するかどうかを確認します。これを行うためのより良い方法があれば、それを聞いてわくわくします!