如何在不阻塞的情况下使用InputStreamReader进行读取

时间:2009-11-01 23:56:40

标签: java inputstream

是否有一种简单的方法来转换标准代码:

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 个答案:

答案 0 :(得分:2)

根据哪种InputStream支持您的阅读器,以及您是否为阅读器使用固定长度的字符编码,您可以在支持流上使用可用的方法。对于InputStream的大多数实现,available()将返回您可以无阻塞地读取的字节数。如果字符编码每个字符使用固定数量的字节,您就知道可以从InputStreamReader中读取多少而不会阻塞。

答案 1 :(得分:2)

要“阻止” ......

1)使用NIO(需要使用下面的频道);或者一个关于NIO用作MINA,XNIO,xSocket等的更好的包装器。我不建议直接使用NIO,因为有许多问题需要处理。

2)使用线程;确保使用标准的线程数据隔离规则以避免头痛。诸如ConcurrentLinkedQueue之类的Concurrency-aware data-structures是您的朋友。

setSoTimeout不会阻止阻塞;它只是为阻塞操作添加了一个超时。我避免它,因为它有很多“怪癖”。使用风险自负。