想當年學 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 雖然在某些地方復雜,但只要稍 加整理,我們仍然可以得到邏輯結構合理的代碼。