【问题标题】:How can you make BufferedReader.readLine() not hang?如何让 BufferedReader.readLine() 不挂起?
【发布时间】:2013-03-08 19:06:30
【问题描述】:

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

我正在创建一个服务器:

  • 检查客户端是否传递了任何输入。
  • 如果不是,它会执行其他代码并最终循环返回检查客户端的输入。

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

【问题讨论】:

  • 为什么?如果您使用阻塞 I/O,服务器应该为每个客户端有一个单独的读取线程。
  • 我不想为每个用户创建两个线程。我已经为每个用户创建了一个线程。
  • 这是 Java I/O 库的不幸现实。您可以 1) 启动单独的线程进行读取 2) 使用 NIO 库 3) 不要使用 readLine() 并自己进行缓冲和行尾管理

标签: java bufferedreader


【解决方案1】:

你可以使用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()

【讨论】:

  • 这不只能保证下次调用read() 不会阻塞吗?该链接没有提及readLine()
  • 即使已经准备好了,也仅仅意味着至少有一个字节,不一定是一整行。这不一定适用于所有情况,尽管您可能会很幸运,并且它适用于您正在做的事情。
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 2017-10-04
  • 2023-04-01
  • 2020-05-13
  • 2017-07-15
  • 1970-01-01
  • 2015-04-30
  • 2012-07-20
相关资源
最近更新 更多