首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 控制台輸入讀取的三種主流方式總結

     編輯:Java 相關知識

概覽

Java 歷經多個版本演進,提供了多種從控制台讀取用戶輸入的方式。本文梳理 JDK 1.4 至 JDK 1.6+ 的三種主流方案,並對比其優缺點與適用場景。

方案一:BufferedReader + InputStreamReader (JDK 1.4+)

經典流式讀取方式,適合按行讀取文本:

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);
    }
}
  • 優點:兼容性最好,所有 JDK 版本通用
  • 缺點:需手動處理異常,無法直接讀取基本類型

方案二:Scanner (JDK 1.5+)

功能豐富的掃描器,支持正則表達式與多種類型解析:

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;
}
  • 優點:API 豐富,直接支持基本類型解析,可讀文件/字符串
  • 缺點:性能略低於 BufferedReader,正則解析有開銷

方案三:Console 類 (JDK 1.6+)

專為交互式控制台設計,支持密碼隱藏輸入:

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, ' ');
        }
    }
}

重要限制

  • IDE 環境下通常返回 null:Eclipse/IntelliJ 重定向了標準流
  • 需在真實終端(cmd、bash、Terminal)中運行
  • 不支持重定向輸入輸出的場景

對比總結表

特性BufferedReaderScannerConsole
最低 JDK1.41.51.6
讀取基本類型手動轉換內建支持需手動轉換
密碼隱藏不支持不支持原生支持
IDE 兼容性完美完美通常不可用
性能高中高
推薦場景簡單行讀取、高性能交互式菜單、混合類型輸入安全密碼輸入、生產環境部署

最佳實踐建議

  1. 一般業務開發:優先使用 Scanner,API 直觀且功能全面
  2. 高性能/大數據讀取:使用 BufferedReader 配合手動解析
  3. 涉及密碼/敏感信息:必須使用 Console.readPassword() 並在用畢後清理內存
  4. IDE 開發測試:避免使用 Console 類,改用前兩者
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved