2013-09-26 53 views
0

就拿以下基本程序:從用戶獲得輸入的衆多方法之間有什麼區別?

import java.util.Scanner; 

public class Practice 
{ 
    public static void main(String[] args) 
    { 
     char userInput; 
     String convertString; 

     do 
     { 
      System.out.println("Here are your choices:"); 
      System.out.println("A. \nB. \nC. \nD."); 

      Scanner kbd = new Scanner(System.in); 
      convertString = kbd.next(); 
      userInput = convertString.charAt(0); 

      switch(userInput) 
      { 
      case 'A': 
       System.out.println("You have chosen A!"); 
       break; 
      case 'B': 
       System.out.println("You have chosen B!"); 
       break; 
      case 'C': 
       System.out.println("You have chosen C!"); 
       break; 
      case 'D': 
       System.out.println("You have chosen D! This program will now terminate."); 
       break; 
      default: 
       System.out.println("Sorry, you have to make a selection."); 
      } 
     } while (userInput > 'D'); 

    } 
} 

它完美的罰款。 但是,如果不使用掃描儀版本,我使用System.in.read()版本,我的程序將循環3次,然後才允許我進行選擇。 爲什麼會發生這種情況,我該如何解決?由於我來自C/C++的背景,我假設這是因爲在輸入流中存在'殘留'字符\ n,並且當程序循環而不允許輸入我想要的輸入時,它正在'清理'流。但是如果這是真的,爲什麼它循環3次而不是一次(因爲要清除\ n你只需要從輸入流中獲得另一個剩餘字符)?

最後,哪種方法最好/更常用?

謝謝!

+2

基於System.in的方法被折舊,不使用它,它是壞的,他們意識到這是不好的,他們給了我們掃描儀,我們很高興 –

+4

System.in.read()從輸入中讀取一個單字節流。嘗試將其包裝在InputStreamReader中並閱讀整行。 – Cruncher

+2

@RichardTingle:'System.in'不被棄用,它也不錯,它不適合這項工作。他們意識到正確的工具丟失了,這就是爲什麼'Scanner'被添加的原因。 – Thomas

回答

0

當您使用System.in.read()時,程序會循環三次,因爲在Windows上,行分隔符是兩個字符:回車符後跟換行符或"\r\n"

在Unix系統(Mac OS X,Linux,Solaris,...)上,行分隔符是單行換行\n

您可以通過包裝在一個BufferedReaderSystem.in和閱讀整線解決這個問題,甚至更好,使用ScannerConsole類,或者最重要的是根據一些人來說,使用圖形用戶界面。

使用舊的方法的一個例子:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
String line = in.readLine(); 

使用Console類的一個例子:

Console con = System.console(); 
String line = con.readLine(); 
+0

使用InputStreamReader應該一樣好嗎?在發送到java程序之前,數據由控制檯緩衝 – Cruncher

+0

InputStreamReader類沒有readLine方法,但它是創建BufferedReader的中間步驟。 – Joni

+0

出於某種原因,我認爲InputStreamReader可以讀取行。好吧 – Cruncher

0

System.inInputStream,這是一個相當低的水平流類類似於C中的std::streambuf或C中的fread。它允許您讀取單個字節和固定大小的字節數組。要做一些有用的事情,你應該把它包裝在一個BufferedReader,它提供了readLine()方法。

相關問題