Java Scanner 无法“完成”读取输入

Java Scanner won't "finish" reading input

提问人:mPierce 提问时间:3/22/2012 最后编辑:skaffmanmPierce 更新时间:9/25/2023 访问量:20891

问:

我在使用 java 的 Scanner 类时遇到了问题。我可以让它很好地读取我的输入,但问题是当我想输出一些东西时。给定多行输入,当所有输入都已完全读取时,我只想打印一行。这是我用于读取输入的代码:

    public static void main(String[] args){
    Scanner scanner = new Scanner(System.in);   //scanner reads block of input
    while(scanner.hasNextLine()){    
        //body of loop goes here
        String s = scanner.nextLine();
        Scanner ls = new Scanner(s);   //scanner to parse a line of input
        while(ls.hasNext()){
        //body of nested loop goes here
        ls.next();
        }
    }
    System.out.println("Fin");
    }

即使读取了所有输入行,程序也不会到达 System.out.println 消息。(请注意,消息不能发送到其他任何地方,否则它将在循环运行时输出多次)。我该如何解决这个问题?任何帮助将不胜感激。

while循环 java.util.scanner

评论

1赞 Lucas 3/22/2012
你能在两个while循环中放一些错误检查打印,并告诉我它被卡在哪一个中吗?
0赞 mPierce 3/23/2012
我尝试在每个循环中放置打印件,但它似乎不是无限循环的,而是更像是外部的 while 循环无限等待更多输入
0赞 Lucas 3/24/2012
有人在下面想通了。
2赞 Basilevs 9/6/2014
输入完成后如何终止扫描仪的可能副本?

答:

0赞 Shashank Kadne 3/22/2012 #1

在本例中,您正在从无限流中读取。 如果此扫描仪的输入中有另一行,则将继续返回 true。由于它是 ,它将继续从键盘读取,除非您终止它或告诉流停止。hasNextLine()System.in

最后按“ctrl+Z”,你会看到它有效。

编辑:你可以做这样的事情......

Scanner scanner = new Scanner(System.in);   //scanner reads block of input
        int BLOCK_SIZE  =3,count=1;
        while(scanner.hasNextLine()){    
            //body of loop goes here
            String s = scanner.nextLine();
            Scanner ls = new Scanner(s);   //scanner to parse a line of input
            while(ls.hasNext()){
            //body of nested loop goes here
            ls.next();
            }
            if(count++==BLOCK_SIZE)
            {
                break;
            }
        }
        System.out.println("Fin");

    }

评论

0赞 mPierce 3/23/2012
那么,有没有办法在读取所有输入后以编程方式阻止它读取呢?
0赞 Shashank Kadne 3/23/2012
你的程序将如何知道它现在应该停止?
0赞 mPierce 3/23/2012
它不知道,这就是问题所在。它只是在读取所有输入后,当我希望它输出时,它会继续等待另一行输入。
0赞 mPierce 3/23/2012
如果我有一个输入块,比如 3 行文本,我希望它在读取第三行后停止
0赞 me_digvijay 3/22/2012 #2

正如我在您使用的外部 while 循环中看到的那样

scanner.hasNextLine();

方法。如果必须等待输入,则此方法将被阻止。你也有

Scanner scanner = new Scanner(System.in);

陈述。因此,system.in 将一直等待输入,因此 hasNextLine() 方法必须等待输入。 这就是为什么控件卡在循环中并且无法继续的原因。

要修复它,您可以先将输入存储在字符串变量中,并在其上调用 scanner 构造函数。

评论

1赞 mPierce 3/23/2012
但是我会在字符串变量中存储什么?程序必须从控制台读取,如果我将输入行保存到字符串中,程序是否仍会等待新的输入行?
0赞 Dunes 3/23/2012 #3

您需要告诉程序将不再有输入。这是通过附加 EOF 字符来完成的。这可以在 Linux 上通过在控制台中按 Ctrl-D 手动完成。我认为在 Windows 上您可以按 Ctrl-Z。如果将输入从一个程序通过管道传输到另一个程序,则流将自动关闭。

例如。

cat filename | java MyJavaProgram
0赞 Mirror318 4/18/2013 #4

的魔力

Scanner scanner = new Scanner(System.in);
    while(scanner.hasNextLine()){ 

是永远不会停止从系统输入(除非您使用 ctrl+d 关闭输入(对于 macs))。

为了停止循环,我建议在条件中抛出更多的东西,而不仅仅是 hasNextLine()。

例如

Scanner scanner = new Scanner(System.in);   //scanner reads block of input
    int BLOCK_SIZE  =3,count=1;
    while(scanner.hasNextLine() && count++ <= BLOCK_SIZE){   //<- Use count here.
        //body of loop goes here
        String s = scanner.nextLine();
        Scanner ls = new Scanner(s);   //scanner to parse a line of input
        while(ls.hasNext()){
        //body of nested loop goes here
        ls.next();
        }
    }
    System.out.println("Fin");

}

评论

0赞 Nate T 11/11/2020
这毫无意义。始终计算结果为 true 的布尔属性的意义何在?有些东西没有加起来。我错过了什么?
0赞 Mirror318 11/11/2020
@NathanToulbert 你说得对,我在 7 年前写了这个答案,我被追上了提问者的现有代码。只有当您计划终止系统输入时,您才需要。hasNextLine
0赞 Senozoid 4/26/2023 #5

你怎么知道用户什么时候完成了输入,下一个“Enter”应该不表示新的输入行,而是表示输入的结束?
您可以尝试计算行数并在最大值后跳出循环。或者,您可以寻找特定的输入(例如“submit”)来打破循环。 否则,如果 ,则程序将每个回车视为一条新线,因此该条件永远不会失败。
scanner.hasNextLine()