是否有一种简单的方法来转换标准代码:
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());
但正如以下所有人所说,这不起作用。其他想法?
答案 0 :(得分:2)
根据哪种InputStream支持您的阅读器,以及您是否为阅读器使用固定长度的字符编码,您可以在支持流上使用可用的方法。对于InputStream的大多数实现,available()
将返回您可以无阻塞地读取的字节数。如果字符编码每个字符使用固定数量的字节,您就知道可以从InputStreamReader中读取多少而不会阻塞。
答案 1 :(得分:2)
要“阻止” ......
1)使用NIO(需要使用下面的频道);或者一个关于NIO用作MINA,XNIO,xSocket等的更好的包装器。我不建议直接使用NIO,因为有许多问题需要处理。
2)使用线程;确保使用标准的线程数据隔离规则以避免头痛。诸如ConcurrentLinkedQueue之类的Concurrency-aware data-structures是您的朋友。
setSoTimeout不会阻止阻塞;它只是为阻塞操作添加了一个超时。我避免它,因为它有很多“怪癖”。使用风险自负。