web-dev-qa-db-ja.com

InputStream.available()はJavaで何をしますか?

JavaInputStream.available()は何をしますか?ドキュメントを読みましたが、まだ理解できません。

文書によると:

この入力ストリームのメソッドの次の呼び出し元によってブロックされることなく、この入力ストリームから読み取ることができる(またはスキップできる)バイト数を返します。次の呼び出し元は、同じスレッドまたは別のスレッドである可能性があります。

クラスInputStreamで使用可能なメソッドは常に0を返します。

blockingとはどういう意味ですか?それは単に同期呼び出しを意味しますか?

そして何よりも、available()メソッドの目的は何ですか?

56

ここでのブロックは、スレッド化または同期とは関係ありません。代わりに、ブロッキングIO(詳細は this を参照)に関連します。読み取り要求を発行し、チャネルに使用可能なものがない場合、ブロッキング呼び出しは待機します(またはブロック)データが利用可能になるまで(またはチャネルが閉じられる、例外をスローするなど)

それでは、なぜavailable()を使用するのでしょうか?したがって、読み取るバイト数を決定したり、ブロックするかどうかを決定したりできます。

JavaにはノンブロッキングIO機能もあります。詳細については here を参照してください。

29
Brian Agnew

InputStreamsでは、read()呼び出しは「ブロック」メソッド呼び出しと呼ばれます。つまり、メソッド呼び出し時にデータが利用できない場合、メソッドはデータが利用可能になるまで待機します。

available()メソッドは、read()呼び出しがプログラムの実行フローをブロックするまで読み取ることができるバイト数を示します。ほとんどの入力ストリームでは、read()へのすべての呼び出しがブロックされているため、availableはデフォルトで0を返します。

ただし、一部のストリーム(BufferedInputStreamなど、内部バッファがある)では、一部のバイトが読み取られてメモリに保持されるため、プログラムフローをブロックせずに読み取ることができます。この場合、available()メソッドは、バッファに保持されているバイト数を示します。

40
Vivien Barousse