什么时候阻止,为什么?

我正尝试通过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和其他阻止扫描程序的方法。

链接地址: http://www.djcxy.com/p/2203.html

上一篇: when does it block and why?

下一篇: How to find text files not containing text on Linux?