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

Java IO 緩衝流與橋接流實戰:BufferedReader/Writer 高效讀寫控制台

     編輯:Java 相關知識

為什麼需要緩衝流?

基礎 IO 類(FileInputStream 等)每次讀寫都直接觸發系統呼叫,頻繁切換用戶/核心態,效率極低。緩衝流在記憶體建立緩衝區(預設 8KB),批量讀取/寫入,大幅減少系統呼叫次數,是提升 IO 效率的首選裝飾流。

體系轉換關鍵:橋接流

位元組流(InputStream)與字符流(Reader)體系不相容,無法直接嵌套。橋接流專門負責跨體系轉換:

  • InputStreamReader:位元組輸入流 → 字符輸入流(指定 Charset 解碼)
  • OutputStreamWriter:位元組輸出流 → 字符輸出流(指定 Charset 編碼)

⚠️ 單向轉換:位元組 → 字符 OK,字符 → 位元組需用 OutputStreamWriter。

經典實戰:高效讀取控制台輸入

標準嵌套結構


BufferedReader br = new BufferedReader(
    new InputStreamReader(System.in) // 橋接:位元組 → 字符
);

完整程式:輸入回顯,quit 退出


import java.io.*;

public class ReadConsoleWithBuffer {
    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            // 三層嵌套:系統流 → 橋接 → 緩衝
            br = new BufferedReader(new InputStreamReader(System.in));
            
            String line;
            do {
                System.out.print("請輸入:");
                line = br.readLine(); // 按行讀取,不含換行符
                if (line == null) break; // EOF (Ctrl+D/Ctrl+Z)
                System.out.println("您輸入:" + line);
            } while (!"quit".equals(line));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 關閉最外層流,會自動級聯關閉內層
            if (br != null) try { br.close(); } catch (IOException ignored) {}
        }
    }
}

關鍵點解析

  • readLine():以 \n/\r\n/\r 為分隔,返回內容不包含換行符;流結束返回 null。
  • BufferedReader 只能包裝 Reader,故必須先用 InputStreamReader 橋接 System.in。
  • 關閉 br.close() 會遞歸關閉 InputStreamReader 和 System.in(但標準流關閉後無法重開,實際專案中通常不關閉 System.in/out/err)。

BufferedWriter 寫入範例


try (BufferedWriter bw = new BufferedWriter(
        new OutputStreamWriter(new FileOutputStream("log.txt"), StandardCharsets.UTF_8))) {
    bw.write("第一行");
    bw.newLine(); // 跨平台換行符
    bw.write("第二行");
    bw.flush(); // 強制刷新緩衝區到磁碟
}

newLine() 會根據系統屬性 line.separator 寫入正確換行符(Win: \r\n, Linux: \n, Mac: \r)。

裝飾流設計模式精髓

原始流 (節點流)
    │
    ▼
┌─────────────┐
│ 裝飾流 A    │ ← 功能增強 A (如緩衝)
│  - delegate │
└──────┬──────┘
       │
       ▼
┌─────────────┐
│ 裝飾流 B    │ ← 功能增強 B (如編碼轉換)
│  - delegate │
└──────┬──────┘
       │
       ▼
   應用程式
  • 每層裝飾流持有對下層流的引用(委派)。
  • 對最外層流的操作,層層委派到底層節點流。
  • 符合開閉原則:新增功能無需修改現有類,只需新增裝飾類。

常見組合速查表

場景推薦嵌套結構
高效讀取文字檔new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"))
高效寫入文字檔new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"))
讀取基本類型/字串new DataInputStream(new BufferedInputStream(new FileInputStream(file)))
序列化物件讀取new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)))

總結

緩衝流是 IO 效率的加速器,橋接流是跨體系的橋樑。掌握三層嵌套標準結構(節點流 → 橋接流 → 緩衝流),即可應對 90% 的文字檔案/控制台讀寫場景。記住:只關閉最外層流,資源鏈自動級聯釋放。

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