java - Scanner.nextLine() 什么时候阻塞?

标签 java

我在客户端/服务器程序中使用 Scanner 进行套接字连接。

我希望 Scanner.next() 阻塞,以便服务器线程可以等待读取内容。

然而,它有时会给我:

java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Scanner.java:1585)
    at cscie55.hw4.Server.serviceClient(Server.java:146)
    at cscie55.hw4.Server.main(Server.java:106)

Java 文档说 next() “有时”会阻塞,但没有说明 nextLine() 是否阻塞。

一些在线代码将它包装在一个测试是否为空的 if 中,但我读到它永远不会返回空。我应该怎么做才能使阻塞 IO 在我的套接字中正常工作?

具体而言,

Scanner.nextLine() 什么时候阻塞而不是抛出 NoSuchElementException?

最佳答案

Scanner 类将在用于构造它的 InputStream 阻塞时阻塞。从文件中读取时通常不会阻塞,因为它的内容随时可用(即 inputStream.available() > 0),毕竟它们在您的机器上。但是,如果您使用可能需要等待数据到达的 InputStream 构造一个 Scanner(例如,从远程客户端读取文本,等待页面加载,因此您可以读取其源代码等)然后 Scanner#nextLine() 将阻塞,因为它需要等待足够的信息来构建下一行到达。

关于java - Scanner.nextLine() 什么时候阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21036054/

相关文章:

java - 什么可以使此 dsl 更易于键入或阅读?

java - 有没有办法从函数中手动导出 testng 测试结果而不单击按钮?

java - Android 绘图应用程序崩溃

java - 如果我正在修改它,是否需要从方法返回一个对象?

java - 如何正确使用BufferedReader

Java,计算 azure 数据库表中的行数

java - 如何使用 Jconsole 连接到 EC2?

java - 接口(interface)与其方法参数类型同名

Java:用一个队列实现堆栈,有什么问题吗?

java - 如何从 IP 地址整数值获取位置详细信息