2015-11-14 25 views
1

我正在研究用戶在標準輸入中輸入文本然後以正確對齊方式返回此文本的小程序。的代碼,其中輸入是由線讀取線Java中的標準輸入爲空

我的主塊:

public static void main(String[] args) {  
    try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {        
      for (String nextLine, line = br.readLine(); line != null; line = nextLine) {     
       nextLine = br.readLine(); 
       // Work with "line" 
      } 
    } 
    catch (IOException ex) {   
     System.exit(-1); 
    } 
} 

但輸入從未讀過所有。始終缺少最後一行,並且line永遠不會是null。經過小小的調試後,我發現br.readLine()nextLine = br.readLine();不會返回任何東西(從字面上看,它不會返回任何東西,不會返回任何異常),程序會繼續運行,但不會執行任何其他代碼行。我也嘗試從文件讀取,並且不會發生此問題。

回答

2

當您的輸入來自標準輸入時,您必須讓程序知道輸入何時結束。否則,它將繼續等待下一個輸入。

因此,您應該決定一些字符或字符串來標記輸入的結尾。

例如,在這裏鍵入done將結束循環:

public static void main(String[] args) {  
    try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {        
      for (String nextLine, line = br.readLine(); line != null && !line.equals("done"); line = nextLine) {     
       nextLine = br.readLine(); 
       // Work with "line" 
      } 
    } 
    catch (IOException ex) {   
     System.exit(-1); 
    } 
} 
3

這可能是因爲readLine()塊,直到一個新的生產線可用,或者流達到EOF(當你從System.in讀這從未發生過)。 你永遠不會得到最後一個輸入,因爲你的循環總是處理先前讀取的行。

試試這個:

for (String line; (line = br.readLine()) != null;) 

,當你讀過所有你需要輸入這個迴路斷線,例如:

if(line.equals("finish")){ 
    break; 
}