我正在尝试通过Scanner
对象读取命令。为了检查输入语法,我使用sc.hasNext()
(对于缺少命令的情况)。它在很多情况下都可以正常工作,但现在我将JavaAPI中描述为“可以阻塞并等待输入”的情况。
hasNext()
方法何时阻止,我该如何控制它?有趣的事情是它在块之前的3个案例中完美地工作。此外,JavaAPI将hasNext()
描述为检查是否存在另一个输入的正确方法,以便方法next()
不会产生Exception
。
这是我到目前为止所做的代码:
if (sc.hasNext() && sc.next().equals("create")) {
if (sc.hasNextInt()) {
width = sc.nextInt();
if (width > 0) {
if (sc.hasNextInt()) {
heigth = sc.nextInt();
if (heigth > 0) {
if (sc.hasNext()) { //At this point the hasNext Statement blocks for //no reason till an Input is made.
charset = sc.next();
Image = new AsciiImage(width, heigth,charset);
} else {
ret = false;
System.out.println("INPUT MISMATCH");
}
} ...//and so on
先谢谢,我在这个主题上找不到任何东西。 编辑:扫描程序被定义为一个System.in,但这应该不是问题 - 至少到目前为止它还没有。
答案 0 :(得分:6)
通过Console或TextFile进行测试之间存在差异。如果我从Console读取,程序需要一个Stream,它将等待进一步的输入。
通过Textfile中的Input进行测试时(仍然使用System.in进行扫描程序,使用Java程序),hasNext()将在文件末尾返回false,因为无法再进行输入。
我无法在此主题上找到文档(在https://docs.oracle.com/javase/9/docs/api/java/util/Scanner.html#hasNext--中)。因此,如果有人找到正确和技术正确的答案,我会非常感激。
答案 1 :(得分:1)
我不确定,但以下是我自己的经验:
当Scanner对象被提供文件时,它不会被阻塞!
术语“用文件喂”是指扫描仪的构造如下:
Scanner scanner = new Scanner("myFile.txt");
但是,如果扫描程序是使用getInputStream()
对象的Socket
方法构建的,则如下所示:
input = socket.getInputStream();
Scanner scanner = new Scanner(input);
扫描仪会阻塞!
答案 2 :(得分:0)
如果您在等待用户输入时没有其他任何操作,则可以在该呼叫时阻止,直到下一个输入到达为止。
如果您确实想在等待输入时运行其他代码,请生成一个新线程并从那里调用hasNext
和其他阻止扫描程序方法。