想當年學 BASIC 的時候,獲取用戶輸入多簡單,就一個 input;後來學 C, 也挺簡單,一個 scanf();後來學 c++,同樣簡單,一個 cin <<;到了 Java 這裡,麻煩來了。
1、簡單的獲取用戶輸入
下面是一個基本的例子,包含解釋:
1.import java.io.BufferedReader; 2.import java.io.InputStreamReader; 3.import java.io.IOException; 4. 5.public class BasicInput { 6. 7. public static void main(String[] args) { 8. try { 9. // 在 Java 當中,用戶輸入要通過 InputStream (輸入流)來獲 取。 10. // System.in 就是系統的輸入流。缺省情況下這個輸入流連接 到控制台(命令行)。 11. // InputStreamReader 就是用來讀取 InputStream 的類。 12. InputStreamReader is_reader = new InputStreamReader (System.in); 13. 14. // 通常使用 BufferedReader 來讀取 InputStream 中的字符 串內容。 15. // BufferedReader 可以一次讀取一行。 16. String str = new BufferedReader(is_reader).readLine(); 17. 18. // 將讀取的字符串輸出到屏幕上。 19. System.out.println("您輸入的是:" + str); 20. } catch (IOException e) { 21. e.printStackTrace(); 22. } 23. } 24.}
看起來不少,實際上只有三行。下面將前面兩行提取出來,放到單獨的方法 中,就成了下面這個樣子(前面的 import 我就省掉了):
1.public class BasicInput { 2. 3. public static void main(String[] args) { 4. try { 5. String str = readUserInput(); 6. System.out.println("您輸入的是:" + str); 7. } catch (IOException e) { 8. e.printStackTrace(); 9. } 10. } 11. 12. /** 13. * 讀取用戶輸入 14. * 15. * @return 用戶輸入 16. * @throws IOException 如果讀取失敗 17. */ 18. private static String readUserInput() throws IOException { 19. InputStreamReader is_reader = new InputStreamReader (System.in); 20. return new BufferedReader(is_reader).readLine(); 21. } 22.}
2、在讀取之前顯示提示文本
有時候需要在讀取前顯示一段文字。下面是繼續改造後的例子:
1.public class BasicInput { 2. 3. public static void main(String[] args) { 4. try { 5. // 先提示一段文字,然後等待用戶輸入 6. String str = readUserInput("請輸入您的年齡: "); 7. System.out.println("您輸入的是:" + str); 8. } catch (IOException e) { 9. e.printStackTrace(); 10. } 11. } 12. 13. /** 14. * 讀取用戶輸入 15. * 16. * @param prompt 提示文字 17. * @return 用戶輸入 18. * @throws IOException 如果讀取失敗 19. */ 20. private static String readUserInput(String prompt) throws IOException { 21. // 輸出提示文字 22. System.out.print(prompt); 23. InputStreamReader is_reader = new InputStreamReader (System.in); 24. return new BufferedReader(is_reader).readLine(); 25. } 26.}
3、不允許用戶輸入為空
這就要用到 while 循環,當用戶輸入為空(沒有輸入就直接回車)的時候重新 要求輸入。下面是將 readUserInput 方法改造後的例子:
1. /** 2. * 讀取用戶輸入 3. * 4. * @param prompt 提示文字 5. * @return 用戶輸入 6. * @throws IOException 如果讀取失敗 7. */ 8. private static String readUserInput(String prompt) throws IOException { 9. // 先定義接受用戶輸入的變量 10. String result; 11. 12. do { 13. // 輸出提示文字 14. System.out.print(prompt); 15. InputStreamReader is_reader = new InputStreamReader (System.in); 16. result = new BufferedReader(is_reader).readLine(); 17. } while (result.equals("")); // 當用戶輸入為空的 時候,反復提示要求用戶輸入 18. 19. return result; 20. }
為了更加靈活的判斷,我們將 while 中的判斷語句提取成一個單獨的方法。 然後整個代碼變成這樣:
1.public class BasicInput { 2. 3. public static void main(String[] args) { 4. try { 5. // 先提示一段文字,然後等待用戶輸入 6. String str = readUserInput("請輸入您的年齡: "); 7. System.out.println("您輸入的是:" + str); 8. } catch (IOException e) { 9. e.printStackTrace(); 10. } 11. } 12. 13. /** 14. * 讀取用戶輸入 15. * 16. * @param prompt 提示文字 17. * @return 用戶輸入 18. * @throws IOException 如果讀取失敗 19. */ 20. private static String readUserInput(String prompt) throws IOException { 21. // 先定義接受用戶輸入的變量 22. String result; 23. 24. do { 25. // 輸出提示文字 26. System.out.print(prompt); 27. InputStreamReader is_reader = new InputStreamReader (System.in); 28. result = new BufferedReader(is_reader).readLine(); 29. } while (isInvalid(result)); // 當用戶輸入無效的時候,反復 提示要求用戶輸入 30. 31. return result; 32. } 33. 34. /** 35. * 檢查用戶輸入的內容是否無效 36. * 37. * @param str 用戶輸入的內容 38. * @return 如果用戶輸入的內容無效,則返回 true 39. */ 40. private static boolean isInvalid(String str) { 41. return str.equals(""); 42. } 43.}
4、只允許用戶輸入數字
本例要求的是輸入用戶年齡。這是一個整數。為了避免得到非法的值,我們 需要進一步對內容進行判斷。因為之前我們將內容判斷這一步單獨提取出來,所 以我們只要修改 isInvalid 方法就行了。判斷一個字符串是不是數字,用正則 表達式是最簡單的。下面是修改後的 isInvalid 方法:
1. private static boolean isInvalid(String str) { 2. return str.equals("") || !str.matches ("\\d+"); 3. }
str.matches("\\d+") 用來判斷字符串是不是全是數字。
到這裡縱觀整個代碼,可以看得出來,Java 雖然在某些地方復雜,但只要稍 加整理,我們仍然可以得到邏輯結構合理的代碼。