Java 扫描仪无法“完成”读取输入

问题描述 投票:0回答:5

我在使用 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 消息。 (请注意,该消息不能发送到其他任何地方,否则它将按照循环运行的次数输出)。我该如何解决?任何帮助将不胜感激。

java while-loop java.util.scanner
5个回答
0
投票

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

scanner.hasNextLine();

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

Scanner scanner = new Scanner(System.in);

声明。所以system.in将一直等待输入,因此hasNextLine()方法必须等待输入。 这就是为什么控制卡在循环中并且无法进一步进行的原因。

要修复它,您可以首先将输入存储在字符串变量中,然后在其上调用扫描仪构造函数。


0
投票

在这种情况下,您正在从无限流中读取数据。如果此扫描仪的输入中有另一行,

hasNextLine()
将继续返回 true。由于它是
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
投票

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

例如。

cat filename | java MyJavaProgram

0
投票

的魔力

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
投票

你如何知道用户何时完成输入并且下一个“Enter”不应该表示新的输入行,而是表示输入的结束?
您可以尝试计算行数并在达到最大值后跳出循环。或者您可以查找特定的输入(例如“提交”)来跳出循环。 否则,使用

scanner.hasNextLine()
,程序将每个回车视为一个新行,因此条件永远不会失败。

© www.soinside.com 2019 - 2024. All rights reserved.