2013-03-19 30 views
5

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

我创建一个服务器:

  • 检查该客户端已交付的任何输入。
  • 如果不是,它会执行其他代码并最终返回检查客户端的输入。

如何检查客户端是否已经交付任何输入而不运行readLine()?如果我运行readLine(),线程将挂起,直到输入交付?

+2

为什么?如果您使用阻止I/O,则服务器应该为每个客户端提供一个单独的读取线程。 – EJP 2013-03-19 21:48:41

+0

我不想为每个用户创建两个线程。我已经为每个用户都有一个线程。 – Cin316 2013-03-19 22:06:16

+1

这是Java I/O库的不幸现实。你可以是 1)分开读取线程 2)使用NIO库 3)不要使用readLine()并自己做自己的缓冲和行尾管理 – creechy 2013-03-19 22:22:41

回答

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如果输入源尚未将任何东西放入尚未读取流。

编辑:只要一张纸条,即使只有一个字符存在,随时会返回true。您可以使用read()来检查是否有换行符或回车符,并且这些将指示行结束。

欲了解更多信息:http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#ready()

+7

这不仅仅保证下一次调用'read()'不会阻塞?该链接没有提及'readLine()'。 – Keppil 2013-03-19 21:45:42

+2

即使准备就绪,这只意味着至少有一个字节,不一定是整行。这并不一定适用于所有情况,尽管你可能会很幸运,并且它会为你正在做的事情工作。 – TofuBeer 2013-03-19 22:45:31