Java api によると、次のInputStream.read()
ように記述されています。
ストリームの終わりに達したために使用できるバイトがない場合は、値 -1 が返されます。このメソッドは、入力データが利用可能になるか、ストリームの終わりが検出されるか、例外がスローされるまでブロックされます。
読み取りを行うwhile(true)
ループがあり、ストリームを介して何も送信されていない場合は常に -1 になります。それは予想されます。
私の質問は、 read() がブロックされるのはいつですか? データを取得しない場合は -1 を返します。データが受信されるまでブロッキング読み取りが待機することを期待します。入力ストリームの最後に到達した場合、read() は -1 を返すのではなく、単にデータを待つべきではありませんか?
または、ストリームにアクセスする別のスレッドがあり、read() がストリームにアクセスできない場合にのみ read() がブロックされますか?
それが私の次の質問につながります。以前は、データが利用可能になったときに通知するイベント リスナー (ライブラリによって提供される) を使用していました。通知を受けたときwhile((aByte = read()) > -1)
、ストアをバイトと呼びました。非常に近い時間に 2 つのイベントを取得し、すべてのデータが表示されていないことに戸惑いました。2 番目のイベントのデータの末尾のみが表示され、残りが欠落しているように見えました。
最終的にコードを変更して、呼び出したイベントが発生したときにif(inputStream.available() > 0) while((aByte = read()) > -1)
バイトを格納するようにしました。今では正常に機能し、すべてのデータが表示されました。
誰かがこの動作を説明できますか? はInputStream.available()
、(ストリームの) 次の呼び出し元をブロックする前に読み取ることができるバイト数を返すと言われています。.available() を使用しない場合でも、最初のイベントの読み取りが 2 番目のイベントの読み取りをブロックするだけで、大量のストリーム データを消去したり消費したりしないと予想されます。これを行うと、すべてのデータが表示されないのはなぜですか?