2012-03-22 91 views
2

我一直在使用java的Scanner类遇到问题。我可以让它读取我的输入就好,但问题是当我想输出的东西。在给定多行输入的情况下,我想在完全读取所有输入时只打印一行。下面是我用读输入代码:Java扫描器不会“读完”输入

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消息。 (请注意,该消息不能在其他地方运行,或者会在循环运行时输出尽可能多的次数)。我该如何解决?任何帮助将不胜感激。

+1

你可以在while循环中加入一些错误检查打印并告诉我它卡在哪一个? – Lucas 2012-03-22 05:35:46

+0

我试图在每个循环中放置打印件,但它似乎无限循环,而不是它更像是外部while循环无限地等待更多输入 – mPierce 2012-03-23 06:46:48

+0

有人想出了下面。 – Lucas 2012-03-23 16:08:33

回答

0

在这种情况下,您正在从无限流中读取数据。如果此扫描仪的输入中有另一行,则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 2012-03-23 04:56:48

+0

你的程序将如何知道它现在应该停止? – 2012-03-23 05:32:54

+0

它不知道,这是问题所在。当所有输入被读取后,我希望它输出时,它会一直等待另一行输入。 – mPierce 2012-03-23 06:20:00

1

正如我可以在你的外看到while循环您使用

scanner.hasNextLine(); 

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

Scanner scanner = new Scanner(System.in); 

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

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

+1

但是,我会在字符串变量中存储什么?程序必须从控制台读取,如果我将输入行保存为字符串,那么程序是否仍然会等待新的输入行? – mPierce 2012-03-23 06:45:19

0

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

例如。

cat filename | java MyJavaProgram 
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"); 

}