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

Java控制台輸入輸出完全指南:從System.in到BufferedReader

     編輯:Java 相關知識

Java控制台交互是入門必修課,理解流體系架構對掌握高級I/O至關重要。本文從字節流到字符流,層層遞進講解輸入輸出核心API。

流體系架構


System.in (InputStream) 字節流
    ↓ InputStreamReader (字節→字符轉換橋樑)
BufferedReader (緩衝字符流) → readLine() 逐行讀取
    ↓
String → Integer.parseInt() 類型轉換

三種輸入方式對比

1. 字節流直接讀取(底層)


// 單字符讀取
int b = System.in.read();  // 阻塞直到輸入,返回ASCII碼
char ch = (char) b;

// 批量讀取到字節數組
byte[] buffer = new byte[1024];
int len = System.in.read(buffer);
String input = new String(buffer, 0, len, StandardCharsets.UTF_8);

2. 字符流+緩衝(推薦標準方式)


BufferedReader reader = new BufferedReader(
    new InputStreamReader(System.in, StandardCharsets.UTF_8)
);

String line = reader.readLine();  // 讀取一行(不含換行符)
// 或指定編碼
BufferedReader reader = new BufferedReader(
    new InputStreamReader(System.in, "GBK")
);

3. Scanner掃描器(高級解析)


Scanner scanner = new Scanner(System.in, StandardCharsets.UTF_8.name());
int age = scanner.nextInt();
double score = scanner.nextDouble();
String name = scanner.next();      // 讀取下一個token(空白分隔)
String line = scanner.nextLine();  // 讀取整行
scanner.close();

完整交互範例:兩數求和


public class ConsoleSum {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(System.in, StandardCharsets.UTF_8))) {
            
            System.out.print("請輸入第一個整數: ");
            int a = parseIntWithRetry(br, "輸入無效,請重新輸入整數: ");
            
            System.out.print("請輸入第二個整數: ");
            int b = parseIntWithRetry(br, "輸入無效,請重新輸入整數: ");
            
            System.out.printf("%d + %d = %d%n", a, b, a + b);
            
        } catch (IOException e) {
            System.err.println("I/O錯誤: " + e.getMessage());
        }
    }
    
    static int parseIntWithRetry(BufferedReader br, String retryPrompt) throws IOException {
        while (true) {
            try {
                String line = br.readLine();
                return Integer.parseInt(line.trim());
            } catch (NumberFormatException e) {
                System.out.print(retryPrompt);
            }
        }
    }
}

輸出流最佳實踐


// 格式化輸出
System.out.printf("姓名: %s, 年齡: %d, 身高: %.2f%n", name, age, height);

// 緩衝輸出(高頻寫入)
try (BufferedWriter bw = new BufferedWriter(
        new OutputStreamWriter(System.out, StandardCharsets.UTF_8))) {
    for (int i = 0; i < 10000; i++) {
        bw.write("行號: " + i);
        bw.newLine();
    }
    bw.flush(); // 確保寫入
}

// 錯誤輸出(重定向分離)
System.err.println("錯誤: 配置文件缺失");

常見坑點與避坑

問題原因解決
中文亂碼編碼不匹配顯式指定StandardCharsets.UTF_8
readLine()返回null流關閉/EOF檢查null後再處理
Scanner.nextInt()後nextLine()讀空行換行符殘留額外調用一次nextLine()消耗換行
控制台無法輸入IDE運行配置勾選"Connect stdin"或使用終端運行

掌握BufferedReader + InputStreamReader組合可覆蓋90%控制台交互場景,Scanner適合結構化解析,字節流用於二進制/自定義協議處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved