我在客户端/服务器程序中使用 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/