Java Scanner不会“完成”读取输入

时间:2012-03-22 05:32:56

标签: java while-loop java.util.scanner

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

4 个答案:

答案 0 :(得分:1)

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

scanner.hasNextLine();

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

Scanner scanner = new Scanner(System.in);

语句。因此system.in将一直等待输入,因此hasNextLine()方法必须等待输入。 这就是为什么控件卡在循环中而无法继续进行。

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

答案 1 :(得分: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");

    }

答案 2 :(得分:0)

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

例如

cat filename | java MyJavaProgram

答案 3 :(得分:0)

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

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

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

E.g。

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");

}