如何避免BufferedReader.readLine()阻塞?

6
有没有办法使BufferedReader.readLine()不挂起?
我正在创建一个服务器,它:
- 检查客户端是否提供了任何输入。 - 如果没有,则执行其他代码,并最终循环回检查客户端是否有输入。
如何在不运行readLine()的情况下检查客户端是否已经提供了任何输入?如果运行readLine(),线程将会挂起,直到有输入为止。

2
为什么?如果你使用阻塞 I/O,服务器应该为每个客户端设置一个单独的读取线程。 - user207421
我不想为每个用户创建两个线程。我已经为每个用户创建了一个线程。 - Cin316
1
这是Java I/O库不幸的现实。你可以选择: 1)为读取启动单独的线程 2)使用NIO库 3)不使用readLine(),自己进行缓冲和行末管理 - creechy
1个回答

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,如果输入源没有向流中写入未被读取的内容。
编辑说明:即使只有一个字符存在,ready()也会返回true。您可以使用read()来检查是否存在换行符或回车符,它们表示一行的结尾。
更多信息请参阅:http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#ready()

7
这难道不只是保证下一次对 read() 的调用不会被阻塞吗?该链接没有提到 readLine() - Keppil
3
即使准备好了,这只意味着至少有一个字节,不一定是整行。尽管你可能会很幸运地成功,但这并不一定适用于所有情况,取决于你正在做什么。 - TofuBeer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接