Java程序開發過程中,需要從鍵盤獲取輸入值是常有的事,但Java它偏偏就沒有像c語言給我們提供的scanf(),C++給我們提供的cin()獲取鍵盤輸入值的現成函數!Java沒有提供這樣的函數也不代表遇到這種情況我們就束手無策,我們來看以下三種解決方法:
方法一:從控制台接收一個字符,然后將其打印出來
代碼示例:
1 //System.in.read()方法,只能接收單個字符 2 private static void inputMethod1() throws IOException { 3 char ch = (char)System.in.read(); 4 System.out.println("鍵盤輸入是:"+ch); 5 }
雖然此方式實現了從鍵盤獲取輸入的字符,但是System.out.read()只能針對一個字符的獲取,同時,獲取進來的變量的類型只能是char,當我們輸入一個數字,希望得到的也是一個整型變量的時候,我們還得修改其中的變量類型,這樣就顯得比較麻煩。
方法二:從控制台接收一個字符串,然后將其打印出來。 在這個題目中,我們需要用到BufferedReader類和InputStreamReader類
BufferedReader是io流中的一個字符、包裝流,它必須建立在另一個字符流的基礎上。但是標准輸入System.in是字節流,所以需要使用InputStreamReader將其包裝成字符流,所以程序中通常這樣寫:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
代碼示例:
1 //BufferedReader類實現 2 private static void inputMethod2() throws IOException { 3 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 4 String buffer = null; 5 while ((buffer = br.readLine()) != null) { 6 System.out.println("鍵盤輸入是:"+buffer); 7 } 8 }
這樣我們就能獲取我們輸入的字符串。
方法三:這種方法我認為是最簡單,最強大的,就是用Scanner類
Scanner是JDK1.5新增的工具類,使用Scanner類可以很方便地獲取鍵盤輸入,它是一個基於正則表達式的文本掃描器,可以從文件、輸入流、字符串中解析出基本類型值和字符串值。
代碼示例:1 //Scanner類實現 2 private static void inputMethod3() { 3 Scanner sc = new Scanner(System.in); 4 System.out.println("請輸入你的姓名:"); 5 String name = sc.nextLine(); 6 System.out.println("請輸入你的年齡:"); 7 int age = sc.nextInt(); 8 System.out.println("請輸入你的工資:"); 9 float salary = sc.nextFloat(); 10 System.out.println("你的信息如下:"); 11 System.out.println("姓名:"+name+"\n"+"年齡:"+age+"\n"+"工資:"+salary); 12 sc.close(); 13 }
這段代碼已經表明,Scanner類不管是對於字符串還是整型數據或者float類型的變量,只需做一點小小的改變,就能夠實現功能!無疑他是最強大的!
但是,在使用第三種輸入方法的時候有一個需要注意的地方,就是nextLine()函數,在io包中有一個和他功能一樣的函數我next()函數,他們的功能一樣,但是在實現上有什么差別呢,請看下面代碼:
1 /* 2 * Scanner類中,next()方法與nextInt()方法的區別與比較 3 * next()方法是不接收空格的,在接收到有效數據前,所有的空格或者tab鍵等輸入被忽略,若有有效數據,則遇到這些鍵退出。 4 * nextLine()可以接收空格或者tab鍵,其輸入應該以enter鍵結束。 5 */ 6 private static void inputCont() { 7 Scanner sc = new Scanner(System.in); 8 System.out.println("請輸入你的年齡:"); 9 int age = sc.nextInt(); 10 System.out.println("請輸入你的姓名:"); 11 String name = sc.nextLine(); 12 System.out.println("請輸入你的工資:"); 13 float salary = sc.nextFloat(); 14 System.out.println("你的信息如下:"); 15 System.out.println("姓名:"+name+"\n"+"年齡:"+age+"\n"+"工資:"+salary); 16 sc.close(); 17 }
這段代碼和上邊第三種實現輸入方法給出的例子代 碼區別在於,這段代碼先執行nextInit()再執行nextLine(),而第三種方法的例子是先執行nextLine(),再執行 nextInit(),當你在運行着兩段代碼的時候你會發現第三種方法的例子可以實現正常的輸入,而這段代碼卻在輸入年齡,敲擊enter鍵后,跳過了輸 入姓名,直接到了輸入工資這里,(可以自己運行代碼看看)這是為什么呢?其實,在執行nextInit()函數之后,敲擊了enter回車鍵,回車符會被 nextLine()函數吸收,實際上是執行了nextLine()函數吸收了輸入的回車符(並不是沒有執行nextLine函數),前面講到和 nextLine()功能一樣的函數next(),他們的區別就在於:next()函數不會接收回車符和tab,或者空格鍵等,所以在使用 nextLine()函數的時候,要注意敲擊的回車符有個被其吸收,導致程序出現BUG!!!
最后小小的總結一下next()和nextLine()的區別:
在java中,next()方法是不接收空格的,在接收到有效數據前,所有的空格或者tab鍵等輸入被忽略,若有有效數據,則遇到這些鍵退出。nextLine()可以接收空格或者tab鍵,其輸入應該以enter鍵結束。
全文參考自:https://www.cnblogs.com/elice/p/5662227.html