2011-02-02 3 views
3

inputstream.available()を使用して、スレッドをブロックせずに読み込むデータがあるかどうかを確認しようとしています。それは> 0の値を返しません。私はそれを間違って使用していますか?InputStream.available()が機能しない

while (slept < logOnTimeOut) { 
    if (sslSocket.getInputStream().available() > 0) { 
     if (input.readLine().equals("OK")) { // todo: set timeout here 
      System.out.println("Successfully Logged On"); 
      isLoggedOn = true; 
      return true; 
     } 
    } else { 
     Thread.sleep(500); 
     slept += 500; 
    } 
} 

答えて

5

読むjavadoc

この入力方法の次の呼び出しによって、ブロックせずに入力ストリームから読み込むことができる(またはスキップできる)推定バイト数を返しますストリーム。次の呼び出しは、同じスレッドまたは別のスレッドである可能性があります。この多くのバイトの単一の読み取りまたはスキップはブロックされませんが、より少ないバイトを読み取ったりスキップしたりすることがあります。

InputStreamの実装によっては、ストリーム内の合計バイト数が返されますが、多くの場合、ストリーム内の合計バイト数は返されません。このメソッドの戻り値を使用して、このストリーム内のすべてのデータを保持するバッファーを割り当てることは正しくありません。

要するに、InputStream.available()は、あなたが考えると半分ほど有用ではありません。

ストリームの終わりを検出する必要がある場合は、read()が見つかり、結果が-1であるかどうかを検出します。 available()は使用しないでください。

+0

しかし、read()は常にスレッドをブロックしますか?ブロックせずにどうやってチェックできますか? – Leon

+0

@ Leon: 'InputStream'ではできません。ノンブロッキングI/Oが必要な場合は、 'java.nio'にあるものを使う必要があります。 – skaffman

+0

私の最後の質問は、1対多の接続のための次の2つのソリューションですが、どちらが優れていますか? 1. nioを使用する 2.新しいスレッドを使用してすべてのクライアントソケットと通信する – Leon