字符流是 Java 處理文本數據的專用管道。其本質是 字節流 + 編碼/解碼器:讀取時將字節按指定字符集解碼為 char;寫入時將 char 編碼為字節。理解這一核心機制,是正確處理中文、避免亂碼、選擇高效 API 的前提。
| 抽象基類 | 關鍵實現類 | 用途 |
|---|---|---|
Reader | FileReader, BufferedReader, InputStreamReader | 字符輸入(讀) |
Writer | FileWriter, BufferedWriter, OutputStreamWriter | 字符輸出(寫) |
InputStreamReader 包裝)。read() 效率極低,必須配合 char[] 或 BufferedReader 使用。new FileWriter(file):覆蓋模式new FileWriter(file, true):追加模式(第二參數 true)new FileWriter(file, Charset.forName("UTF-8")):Java 11+ 支持顯式編碼flush()、close() 或緩衝區滿時才落盤。readLine() 返回一行文本(不含換行符),遇文件結尾返回 nullnewLine() 自動寫入系統行分隔符(System.lineSeparator())flush() 確保數據及時落盤這是字節流與字符流的轉換樞紐,必須顯式指定 Charset:
// 讀取 UTF-8 文件(推薦寫法)
try (Reader reader = new InputStreamReader(new FileInputStream("data.txt"), StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(reader)) {
String line;
while ((line = br.readLine()) != null) {
process(line);
}
}
// 寫入 GBK 文件(兼容舊系統)
try (Writer writer = new OutputStreamWriter(new FileOutputStream("legacy.txt"), "GBK");
BufferedWriter bw = new BufferedWriter(writer)) {
bw.write("中文內容");
bw.newLine();
}
public class TextFileCopy {
public static void copy(String src, String dest, String charset) throws IOException {
try (BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(src), charset));
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(dest), charset))) {
char[] buffer = new char[8192];
int len;
while ((len = br.read(buffer)) != -1) {
bw.write(buffer, 0, len);
}
}
}
}
public class LargeFileProcessor {
public static void processLineByLine(String filePath, String charset, LineConsumer consumer) throws IOException {
try (BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(filePath), charset))) {
String line;
while ((line = br.readLine()) != null) {
consumer.accept(line);
}
}
}
@FunctionalInterface
interface LineConsumer { void accept(String line); }
}
掌握字符流的編碼本質、緩衝機制與 API 選型,是 Java 開發者處理文本數據的基本功。下一篇將深入剖析 PrintWriter、StringWriter 等特殊字符流的應用場景。