2013-03-19 64 views
5

有沒有辦法使BufferedReader.readLine()不掛?如何使BufferedReader.readLine()不掛起?

我創建一個服務器:

  • 檢查該客戶端已交付的任何輸入。
  • 如果不是,它會執行其他代碼並最終返回檢查客戶端的輸入。

如何檢查客戶端是否已經交付任何輸入而不運行readLine()?如果我運行readLine(),線程將掛起,直到輸入交付?

+2

爲什麼?如果您使用阻止I/O,則服務器應該爲每個客戶端提供一個單獨的讀取線程。 – EJP 2013-03-19 21:48:41

+0

我不想爲每個用戶創建兩個線程。我已經爲每個用戶都有一個線程。 – Cin316 2013-03-19 22:06:16

+1

這是Java I/O庫的不幸現實。你可以是 1)分開讀取線程 2)使用NIO庫 3)不要使用readLine()並自己做自己的緩衝和行尾管理 – creechy 2013-03-19 22:22:41

回答

8

您可以使用BufferedReader.ready(),像這樣:

BufferedReader b = new BufferedReader(); //Initialize your BufferedReader in the way you have been doing before, not like this. 

if(b.ready()){ 
    String input = b.readLine(); 
} 

ready()將返回true如果輸入源尚未將任何東西放入尚未讀取流。

編輯:只要一張紙條,即使只有一個字符存在,隨時會返回true。您可以使用read()來檢查是否有換行符或回車符,並且這些將指示行結束。

欲瞭解更多信息:http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#ready()

+7

這不僅僅保證下一次調用'read()'不會阻塞?該鏈接沒有提及'readLine()'。 – Keppil 2013-03-19 21:45:42

+2

即使準備就緒,這隻意味着至少有一個字節,不一定是整行。這並不一定適用於所有情況,儘管你可能會很幸運,並且它會爲你正在做的事情工作。 – TofuBeer 2013-03-19 22:45:31