簡體   English   中英

如何在不阻塞的情況下使用InputStreamReader進行讀取

[英]how to read using InputStreamReader without blocking

是否有一種簡單的方法來轉換標准代碼:

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());

但正如下面的每個人所說,這不起作用。 其他想法?

根據哪種InputStream支持您的閱讀器,如果您使用讀取器的固定長度字符編碼,您可以使用支持流上的可用方法。 對於InputStream的大多數實現, available()將返回您可以無阻塞地讀取的字節數。 如果字符編碼每個字符使用固定數量的字節,您就知道可以在不阻塞的情況下從InputStreamReader中讀取多少內容。

要“阻止”阻止 ......

1)使用NIO(需要使用下面的頻道); 或者關於NIO用作MINA, XNIO ,xSocket等的更好的包裝器。我不建議直接使用NIO,因為有許多問題需要處理。

2)使用線程; 確保使用標准的線程數據隔離規則以避免頭痛。 並發感知數據結構 (如ConcurrentLinkedQueue)是您的朋友。

setSoTimeout不會阻止阻塞; 它只是為阻塞操作添加了一個超時。 我避免它,因為它有很多“怪癖”。 使用風險由您自己承擔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM