早期 BASIC 用 INPUT、C 用 scanf()、C++ 用 cin,Java 卻需要串流包裝,初學者常覺得繁瑣。本文以「讀取使用者輸入」為例,逐步重構,展示從基礎 API 到彈性驗證的完整演進,幫你建立清晰的 I/O 觀念與良好程式結構。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class BasicInput {
public static void main(String[] args) {
try {
// System.in 為標準輸入位元組串流(預設連接控制台)
InputStreamReader isReader = new InputStreamReader(System.in);
// BufferedReader 可一次讀取一行字串
String str = new BufferedReader(isReader).readLine();
System.out.println("您輸入的是:" + str);
} catch (IOException e) {
e.printStackTrace();
}
}
}
核心三行:InputStreamReader(位元組→字元)→ BufferedReader(緩衝讀行)→ readLine()。
public class BasicInput {
public static void main(String[] args) {
try {
String str = readUserInput("請輸入您的年齡:");
System.out.println("您輸入的是:" + str);
} catch (IOException e) {
e.printStackTrace();
}
}
private static String readUserInput(String prompt) throws IOException {
System.out.print(prompt); // 不換行顯示提示
InputStreamReader isReader = new InputStreamReader(System.in);
return new BufferedReader(isReader).readLine();
}
}
private static String readUserInput(String prompt) throws IOException {
String result;
do {
System.out.print(prompt);
InputStreamReader isReader = new InputStreamReader(System.in);
result = new BufferedReader(isReader).readLine();
} while (result.equals("")); // 空字串重新輸入
return result;
}
public class BasicInput {
public static void main(String[] args) {
try {
String str = readUserInput("請輸入您的年齡:");
System.out.println("您輸入的是:" + str);
} catch (IOException e) {
e.printStackTrace();
}
}
private static String readUserInput(String prompt) throws IOException {
String result;
do {
System.out.print(prompt);
InputStreamReader isReader = new InputStreamReader(System.in);
result = new BufferedReader(isReader).readLine();
} while (isInvalid(result)); // 委派驗證
return result;
}
private static boolean isInvalid(String str) {
return str.equals(""); // 可擴充:長度、格式、正則等
}
}
private static boolean isInvalid(String str) {
return str.equals("") || !str.matches("\\d+");
}
str.matches("\\d+") 判斷是否全為數字。若需正負整數:-?\\d+;浮點數:-?\\d+(\\.\\d+)?。
import java.io.*;
public class BasicInput {
public static void main(String[] args) {
try {
String str = readUserInput("請輸入您的年齡:");
System.out.println("您輸入的是:" + str);
} catch (IOException e) {
e.printStackTrace();
}
}
private static String readUserInput(String prompt) throws IOException {
String result;
do {
System.out.print(prompt);
InputStreamReader isReader = new InputStreamReader(System.in);
result = new BufferedReader(isReader).readLine();
} while (isInvalid(result));
return result;
}
private static boolean isInvalid(String str) {
return str.equals("") || !str.matches("\\d+");
}
}
import java.util.Scanner;
public class ScannerInput {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入您的年齡:");
while (!scanner.hasNextInt()) {
System.out.print("請輸入數字:");
scanner.next(); // 丟棄非數字
}
int age = scanner.nextInt();
System.out.println("您輸入的是:" + age);
}
}
Scanner 內建 hasNextInt()、nextInt() 等型別檢查,適合簡單互動;但大量資料或需精確控制編碼時,BufferedReader 更靈活。
Java 控制台輸入雖需串流包裝,但透過方法抽取、驗證邏輯分離、正則表達式,即可得到結構清晰、易擴充的程式碼。掌握 InputStreamReader → BufferedReader 基礎鏈,再視需求選擇 Scanner 或自訂驗證框架,是處理互動式輸入的扎實功力。