2015-11-11 35 views
8

我正在學習JAVA並輸入以下DO ... WHILE示例。如果輸入'q',程序將退出。它運行,但爲什麼我得到三行「請一個鍵,然後回車:」?一個非常簡單的java do ... while循環

class DWDemo { 
    public static void main (String args[]) 
     throws java.io.IOException { 
      char ch; 
      do { 
       System.out.println("Please a key followed by ENTER:"); 
       ch = (char) System.in.read(); 
      } while (ch != 'q'); 
     } 
} 

enter image description here

回答

10

因爲當你鍵入a和命中Enter,那麼in.read()方法返回三個大字 - 'a',對於回車\r字符和換行字符('\n')。 (請注意,組合\r\n在Windows下被視爲換行符)。

如果您在Linux或OSX下運行,您的程序將具有顯着不同的行爲,因爲換行符是特定於您正在運行該程序的操作系統的。例如,在Linux下,它將是\n,在OS X-9下它將是\r

作爲變通,你可以閱讀整條生產線(通過使用Scanner)和修剪它,這將省略斷行字符(不考慮操作系統類型):

public static void main (String args[]) throws java.io.IOException { 
     String line; 
     Scanner sc = new Scanner(System.in); 
     do { 
      System.out.println("Please a key followed by ENTER:"); 
      line = sc.readLine().trim(); 
     } while (!"q".equals(line)); 
    } 
5

我認爲作爲輸入包含您的ENTER按鍵得到什麼閱讀。由於您在Windows上,因此包含CRFL行結尾。

因此,每次輸入字符時,都會輸入3個字符。如果您第一次輸入:

  1. 一個
  2. CR
  3. LF

嘗試通過讀一個BufferedReader全行,並運行一個空格上修剪,或者只是評價其第一個字符。

3

打字的時候在Windows系統上的命令行上輸入,所有行以包含字符\r\n的換行符結尾。所以當你第一次輸入a時,你實際上是在輸入a\r\n

代碼System.in.read()運行時,它只讀取已輸入緩衝區的第一個字符,在此例中爲a。然後循環運行,打印出提示並嘗試讀取緩衝區中的下一個字符。在這種情況下,\r\n仍在緩衝區中,因此它在\r中讀取。再次循環讀取\n。最後,它會在緩衝區爲空時第三次打印提示,並等待輸入。

爲了避免這種情況,我建議使用不同的方法從命令行讀取而不是System.In。也許Scanner類會更合適。

+0

這幾乎是正確的,只是讀取不返回字符;它返回字節。如果輸入非ASCII字符,則可能會返回兩個連續值,具體取決於默認編碼。 –

1

您必須注意的一件事是System.in.read()只需要1個字節的輸入。請參閱文檔here。所以,當你輸入一個字符a,這已經是一個字節,通過輸入額外ENTER鍵,人物:\r\n,將由read()兩次,這將觸發額外的循環迭代和打印邏輯被捕獲。

0

@ kasoban表示他們是a,CR和LF。它重複3次,但會根據操作系統而改變。所以我建議你使用掃描儀。您可以在下面找到示例

public class DW { 
    public static void main (String args[]) throws java.io.IOException { 
     String s; 
     Scanner scanner = new Scanner(System.in); 
     do { 
      System.out.println("Please a key followed by ENTER:"); 
      s = scanner.nextLine(); 
     } while (!"q".equals(s)); 
     } 
    }