Scanner.nextLine()何时阻止?

时间:2014-01-10 04:10:39

标签: java

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

我希望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测试null中,但我读到它永远不会返回null。我该怎么做才能阻止IO在我的套接字中正常工作?

具体地,

Scanner.nextLine()何时阻止而不是抛出NoSuchElementException?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

如果它正在从网络读取并且输入中没有数据或没有换行符且它未到达EOS,则会阻止。你必须从文件中读取。