2014-06-09 142 views
1

我堅持與System.in.read()有關的問題。我想打印粘貼到控制檯的所有內容。 我的代碼如下所示:爲什麼不能用system.in.read()得到控制檯最後一行的while循環?

import java.io.IOException; 

public class printer { 
    public static void main(String[ ] args) { 
     int i; 
     try { 
      while ((i = System.in.read()) != -1) { 
       char c = (char)i; 
       System.out.print(c); 
      } 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
  1. 的問題是,如果粘貼,例如,三線到控制檯程序將然後打印的兩個第一線,但不是第三。這是爲什麼?它打印第三個,如果我按下輸入但第二行和第三行之間有巨大的空間。

  2. 我也嘗試將每個字符存儲在一個字符串中,然後在循環後打印整個字符串,但循環永遠不會結束。是他們的一種方法來阻止這個特定的循環(我不知道用戶將有多少行粘貼)

+1

請看看[this](http://stackoverflow.com/questions/1066318/how-to-read-a-single-char-from-the-console-in-java-as-the-用戶類型 - 它)的討論。 – BugProtectionActivist

+0

您正在嘗試的是高度依賴於系統的問題:首先確定粘貼的內容,然後是輸入緩衝區管理。你能說一下你的工作系統(Windows,Linux,...)。無論如何,你應該嘗試記錄你閱讀的字符的代碼。 –

回答

1

您的應用程序相呼應,在控制檯中鍵入任何線(或粘貼)。問題是,遊戲機已經成爲過去,他們應該一行一行地做東西。這意味着您的應用程序僅在閱讀新行字符後纔打印,因爲System.in.read塊。

您粘貼的文本已包含兩個換行符,但最後一行缺少此分隔符。這是你發佈什麼,在哪裏<nl>意味着一個換行符:

line1<nl>line2<nl>line3 

如果你去你喜歡的文本編輯器,粘貼進去,在結尾處加上一個額外的換行,並與「全選所有的再次複製「菜單,你會看到最後一行。

+0

好吧,我明白了,但我不能在每個控制檯文本的最後一行之後添加。有什麼方法可以包含最後一行(即使最後沒有)? 是否有可能在用戶粘貼控制檯中的文本後停止循環? – user3712130

+0

你可以直接從剪貼板抓取文本。看看[這個答案](http://stackoverflow.com/a/7106086)。關於第二個問題,循環僅在'read'返回-1時退出,並且如果控制檯關閉流(我很抱歉,我不知道涉及的具體機制)會發生這種情況。 –

相關問題