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

Java 文本文件處理精要:Reader/Writer 體系深度解析

     編輯:Java 程式設計入門

設計動機:彌補 byte 流的文本短板

早期 Java 僅提供 InputStream/OutputStream 字節流,處理文本需手動處理編碼轉換,極其繁瑣。引入 Reader/Writer 抽象類及其子類,確立「字節流 ↔ 字符流」橋梁模式,徹底簡化文本 I/O。

核心類層次與職責

類別代表實現核心職責
字節→字符橋梁InputStreamReader / OutputStreamWriter指定編碼(如 UTF-8/GBK),將字節流轉為字符流
文件便捷類FileReader / FileWriter內部封裝橋梁類,默認使用平台編碼,簡化文件操作
緩衝增強BufferedReader / BufferedWriter內部維護字符緩衝區,提供 readLine()、newLine() 等高級 API
格式化輸出PrintWriter支持 println()、printf(),可自動 flush(構造器第二參數 true)

讀取文本的三種範式

1. 基礎 FileReader(單字符,教學用)

FileReader fr = new FileReader("ming.txt");
int ch;
while ((ch = fr.read()) != -1) {
    System.out.print((char) ch);
}
fr.close();

2. 顯式編碼 InputStreamReader(生產必備)

InputStreamReader isr = new InputStreamReader(
    new FileInputStream("ming.txt"), "UTF-8");
int ch;
while ((ch = isr.read()) != -1) {
    System.out.print((char) ch);
}
isr.close();

3. 緩衝逐行 BufferedReader(高性能標準)

BufferedReader br = new BufferedReader(
    new InputStreamReader(new FileInputStream("ming.txt"), "UTF-8"));
String line;
while ((line = br.readLine()) != null) {
    System.out.println(line);
}
br.close();

寫入文本的三種範式

1. FileWriter 直接寫入

FileWriter fw = new FileWriter("hello.txt");
String s = "hello world";
fw.write(s, 0, s.length());
fw.flush(); // 強制刷新緩衝區
fw.close();

2. OutputStreamWriter 指定編碼

OutputStreamWriter osw = new OutputStreamWriter(
    new FileOutputStream("hello2.txt"), "UTF-8");
osw.write(s, 0, s.length());
osw.flush();
osw.close();

3. PrintWriter 格式化輸出(推薦)

// true = autoFlush,遇 println/printf/format 自動刷新
PrintWriter pw = new PrintWriter(
    new OutputStreamWriter(new FileOutputStream("hello3.txt"), "UTF-8"), true);
pw.println(s);
pw.close();

完整整合示例

測試文件 ming.txt 內容:

hello world i like java language
import java.io.*;

public class TestFile2 {
    public static void main(String[] args) throws IOException {
        // 1. FileReader 逐字符
        FileReader fr = new FileReader("ming.txt");
        int ch;
        while ((ch = fr.read()) != -1) System.out.print((char) ch);

        // 2. InputStreamReader 逐字符
        InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));
        while ((ch = isr.read()) != -1) System.out.print((char) ch);

        // 3. BufferedReader 逐行
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
        String line;
        while ((line = br.readLine()) != null) System.out.println(line);

        // 寫入演示
        FileWriter fw = new FileWriter("hello.txt");
        String s = "hello world";
        fw.write(s, 0, s.length()); fw.flush();

        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("hello2.txt"));
        osw.write(s, 0, s.length()); osw.flush();

        PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("hello3.txt")), true);
        pw.println(s);

        // 統一關閉(實際建議 try-with-resources)
        fr.close(); isr.close(); br.close();
        fw.close(); osw.close(); pw.close();
    }
}

避坑指南

  • 編碼顯式化:永遠不要依賴平台默認編碼,構造橋梁類時必須指定 StandardCharsets.UTF_8。
  • 緩衝必加:直接用 FileReader/Writer 處理大文件性能極差,務必包裝 BufferedReader/Writer。
  • flush 與 close:flush() 僅刷緩衝區,close() 會先 flush 再釋放文件句柄,二者不可互相替代。
  • 資源管理:JDK 7+ 必須使用 try-with-resources,避免異常路徑導致洩漏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved