2009-11-01 101 views
1

讀的是有一個簡單的辦法把標準代碼:如何使用InputStreamReader的無阻塞

in = new InputStreamReader(socket.getInputStream()); 
String message = ""; 
while ((size = in.read(buf)) != -1){ 
    message += new String(buf, 0, size); 
} 

使read()不會阻止。我試過了:

if (!in.ready()) 
    //throw exception 

但是這個拋出一個異常。也許:

socket.setSoTimeout(120000); 
in = new InputStreamReader(socket.getInputStream()); 

但是,正如下面所有人所述,這是行不通的。其他想法?

回答

2

根據您的閱讀器支持哪種類型的InputStream,以及如果您正在爲閱讀器使用固定長度的字符編碼,您可能可以使用支持流中的可用方法。對於InputStream的大多數實現,available()將返回您可以讀取而不被阻塞的字節數。如果字符編碼爲每個字符使用固定數量的字節,則您知道可以從InputStreamReader讀取多少內容而不會阻塞。

2

「預防阻塞」 或者 ...

1)使用NIO(這需要使用頻道的下方);或者是關於NIO用作MINA,XNIO,xSocket等的更好的包裝。我不推薦直接使用NIO,因爲有很多問題需要處理。

2)使用線程;確保使用標準的線程數據隔離規則以避免頭痛。例如ConcurrentLinkedQueue等Concurrency-aware data-structures是你的朋友。

setSoTimeout不會阻止阻塞;它只是增加了阻塞操作的超時時間。我避免它,因爲它有許多「怪癖」。使用風險自負。

+0

或JDK7中的新異步API(「更多NIO功能」的一部分)。 – 2009-11-02 04:49:02

+0

1-聽起來像是外部包裝。如果是這樣,我會嘗試解決沒有外部包的問題 2-我已經在使用線程 – Guy 2009-11-02 07:19:52