Java 如何使BufferedReader.readLine()不挂起?

Java 如何使BufferedReader.readLine()不挂起?,java,bufferedreader,Java,Bufferedreader,有没有办法使BufferedReader.readLine()不挂起 我正在创建一个服务器: 检查客户端是否已传递任何输入 如果没有,它将执行其他代码,并最终返回到检查客户机的输入 如何检查客户端是否在未运行readLine()的情况下发送了任何输入?如果我运行readLine(),线程将挂起,直到输入被传递?您可以使用BufferedReader.ready(),如下所示: BufferedReader b = new BufferedReader(); //Initialize your

有没有办法使
BufferedReader.readLine()不挂起

我正在创建一个服务器:

  • 检查客户端是否已传递任何输入
  • 如果没有,它将执行其他代码,并最终返回到检查客户机的输入

如何检查客户端是否在未运行
readLine()
的情况下发送了任何输入?如果我运行
readLine()
,线程将挂起,直到输入被传递?

您可以使用
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()
检查是否存在换行或回车,这些将指示换行结束


有关更多信息:

这难道不能保证下次调用
read()
时不会被阻塞吗?这个链接没有提到
readLine()
。即使它已经准备好了,也只意味着至少有一个字节,不一定是一整行。这并不一定在所有情况下都有效,尽管你可能会很幸运,而且它对你正在做的事情有效。为什么?如果使用阻塞I/O,服务器应该为每个客户机有一个单独的读取线程。我不想为每个用户创建两个线程。我已经为每个用户提供了一个线程,这是Java的I/O库的不幸现实。您可以1)启动单独的线程进行读取2)使用NIO库3)不使用readLine(),自己进行缓冲和行末管理