Java 歷經多個版本演進,提供了多種從控制台讀取用戶輸入的方式。本文梳理 JDK 1.4 至 JDK 1.6+ 的三種主流方案,並對比其優缺點與適用場景。
經典流式讀取方式,適合按行讀取文本:
import java.io.*;
public class ConsoleReaderV1 {
public static String readLine(String prompt) {
System.out.print(prompt);
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
return br.readLine();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
String input = readLine("請輸入內容:");
System.out.println("您輸入了:" + input);
}
}
功能豐富的掃描器,支持正則表達式與多種類型解析:
import java.util.Scanner;
public class ConsoleReaderV2 {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
System.out.print("請輸入整數:");
int num = scanner.nextInt();
System.out.print("請輸入字符串:");
scanner.nextLine(); // 消耗換行符
String str = scanner.nextLine();
System.out.printf("整數:%d,字符串:%s%n", num, str);
}
}
}
public static double sumNumbersInFile(String filename) throws IOException {
double sum = 0;
try (Scanner scanner = new Scanner(new File(filename))) {
while (scanner.hasNext()) {
if (scanner.hasNextDouble()) {
sum += scanner.nextDouble();
} else {
String token = scanner.next();
if ("done".equals(token)) break;
}
}
}
return sum;
}
專為交互式控制台設計,支持密碼隱藏輸入:
import java.io.Console;
public class ConsoleReaderV3 {
public static void main(String[] args) {
Console console = System.console();
if (console == null) {
System.err.println("無法獲取 Console 實例(可能在 IDE 中運行)");
return;
}
String username = console.readLine("用戶名:");
char[] password = console.readPassword("密碼:"); // 無回顯
try {
if ("admin".equals(username) && "123456".equals(new String(password))) {
console.printf("歡迎 %s%n", username);
} else {
console.printf("認證失敗%n");
}
} finally {
// 安全清理密碼數組
if (password != null) java.util.Arrays.fill(password, ' ');
}
}
}
| 特性 | BufferedReader | Scanner | Console |
|---|---|---|---|
| 最低 JDK | 1.4 | 1.5 | 1.6 |
| 讀取基本類型 | 手動轉換 | 內建支持 | 需手動轉換 |
| 密碼隱藏 | 不支持 | 不支持 | 原生支持 |
| IDE 兼容性 | 完美 | 完美 | 通常不可用 |
| 性能 | 高 | 中 | 高 |
| 推薦場景 | 簡單行讀取、高性能 | 交互式菜單、混合類型輸入 | 安全密碼輸入、生產環境部署 |
Scanner,API 直觀且功能全面BufferedReader 配合手動解析Console.readPassword() 並在用畢後清理內存Console 類,改用前兩者