早期 Java 僅提供 InputStream/OutputStream 字節流,處理文本需手動處理編碼轉換,極其繁瑣。引入 Reader/Writer 抽象類及其子類,確立「字節流 ↔ 字符流」橋梁模式,徹底簡化文本 I/O。
| 類別 | 代表實現 | 核心職責 |
|---|---|---|
| 字節→字符橋梁 | InputStreamReader / OutputStreamWriter | 指定編碼(如 UTF-8/GBK),將字節流轉為字符流 |
| 文件便捷類 | FileReader / FileWriter | 內部封裝橋梁類,默認使用平台編碼,簡化文件操作 |
| 緩衝增強 | BufferedReader / BufferedWriter | 內部維護字符緩衝區,提供 readLine()、newLine() 等高級 API |
| 格式化輸出 | PrintWriter | 支持 println()、printf(),可自動 flush(構造器第二參數 true) |
FileReader fr = new FileReader("ming.txt");
int ch;
while ((ch = fr.read()) != -1) {
System.out.print((char) ch);
}
fr.close();
InputStreamReader isr = new InputStreamReader(
new FileInputStream("ming.txt"), "UTF-8");
int ch;
while ((ch = isr.read()) != -1) {
System.out.print((char) ch);
}
isr.close();
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();
FileWriter fw = new FileWriter("hello.txt");
String s = "hello world";
fw.write(s, 0, s.length());
fw.flush(); // 強制刷新緩衝區
fw.close();
OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("hello2.txt"), "UTF-8");
osw.write(s, 0, s.length());
osw.flush();
osw.close();
// 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 再釋放文件句柄,二者不可互相替代。try-with-resources,避免異常路徑導致洩漏。