什么时候阻止,为什么?
我正尝试通过Scanner
对象读取命令。 为了检查输入语法我使用sc.hasNext()
(对于缺少命令的情况)。 它在许多情况下都能正常工作,但现在我已将JavaAPI中描述的情况描述为“可能会阻止并等待输入”。
hasNext()
方法块何时可以控制? 有趣的事情是,它的工作完全正常,前3块的情况下。 此外,JavaAPI将hasNext()
描述为检查是否存在另一个Input的正确方法,以便Method 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,但这不应该是一个问题 - 至少它现在还没有。
通过控制台或通过TextFile进行测试是有区别的。 如果我从Console读取程序期望一个流,它将等待进一步的输入。
当通过Textfile输入进行测试(仍然使用Scanner的System.in,使用Java程序)时,hasNext()将在文件末尾返回false,因为不能进行进一步的输入。
我无法找到有关此主题的文档(位于https://docs.oracle.com/javase/9/docs/api/java/util/Scanner.html#hasNext--)。 所以如果有人找到一个适当和技术性的正确答案,我会非常棒。
我不确定,但以下是我自己的经验:
当Scanner对象被一个文件提供时,它不会被阻塞!
术语“用文件提供”我的意思是扫描仪是这样构造的:
Scanner scanner = new Scanner("myFile.txt");
但是,如果扫描器是使用Socket
对象的getInputStream()
方法构造的,如下所示:
input = socket.getInputStream();
Scanner scanner = new Scanner(input);
扫描仪将被阻挡!
如果在等待用户输入时没有别的事情要做,那么在该呼叫被阻止之前,直到下一个输入到达为止。
如果您希望在等待输入的同时运行其他代码,请生成一个新线程并从那里调用hasNext
和其他阻止扫描程序的方法。