2

available()Javaでのソケットプログラミングでの使用は信頼できますか?

読み取りメソッドを呼び出すときにブロックされないように、読み取りに使用できるバイトがあるときにそれが通知されるようにするだけです。

BufferedInputStream.available()に依存しInputStream.available()ます。

InputStream.available() のドキュメントには、次のように書かれています。

InputStream の一部の実装はストリーム内の合計バイト数を返しますが、多くはそうではないことに注意してください。このメソッドの戻り値を使用して、このストリーム内のすべてのデータを保持するためのバッファーを割り当てることは決して正しくありません。 http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available()

正しいバイト数が得られるかどうかは気にしませんが、読み取り可能なバイトがある場合に 0 が返されないだけです。BufferedInputStream.available() が Windows と Linux でこの目的のために常に機能するかどうかを知りたいです。

また、ドキュメントの「実装」が何を意味するのかわかりません。それは何を指していますか?InputStream のサブクラスに? 異なるオペレーティング システムで Java するには? 異なる JVM に?

Windows、Linux、またはその他のシステムで available() を使用して、機能しなかった人はいますか?

4

2 に答える 2

2

質問でリンクしているのと同じドキュメントには、次のように書かれています。

この数のバイトの単一の読み取りまたはスキップはブロックされませんが、より少ないバイトの読み取りまたはスキップが可能です。

したがって、0を返さない場合にI / Oがブロックされないという意味で「安全」であると言えます。一方、実際にゼロ以外が返されるという保証はありません。読み取るバイト。

InputStreamこれは抽象クラスであるため、InputStream必要なオブジェクトはすべてサブクラスであることに注意してください。これが、ドキュメントが「実装」によって意味するものです。具体的なサブクラスはすべて、すべての抽象メソッドを実装します。

于 2012-08-23T01:23:38.937 に答える
1

他のスレッドですでに説明したように、SSLSocketにラップする場合は間違いなく信頼できません。常にゼロを返します。

于 2012-08-23T03:20:31.260 に答える