2012-03-22 117 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"); 

}