2011-02-02 21 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

但閱讀()會一直阻塞線程吧?我怎樣才能檢查沒有阻止? – Leon 2011-02-02 15:37:26