早期 Java 不支援文本文件處理,引入 Reader、Writer 兩個抽象類彌補。Writer 的 write(char[], int, int)、flush()、close() 為抽象方法;Reader 的 read(char[], int, int)、close() 為抽象方法,子類需分別實現。
常用類:FileReader、InputStreamReader、BufferedReader。關鍵橋梁是 InputStreamReader:位元組轉字符,構造器可指定編碼(不指定用 OS 默認如 GBK)。
FileReader fr = new FileReader("ming.txt");
int ch = 0;
while ((ch = fr.read()) != -1) {
System.out.print((char) ch);
}
read() 返回下一字符。也可用 read(char[], int, int) 批量讀取,類似二進制處理。
InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"), "UTF-8");
int ch = 0;
while ((ch = isr.read()) != -1) {
System.out.print((char) ch);
}
實際上 FileReader 方法皆繼承自 InputStreamReader,無本質區別。
read() 較耗時。用 BufferedReader 包裝提速,可逐行讀取:
BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream("ming.txt"), "UTF-8"));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
對應讀取,寫入同樣簡單。注意:寫入數據先進緩衝區,需主動 flush() 強制寫入文件。
FileWriter fw = new FileWriter("out.txt");
fw.write("Hello World");
fw.flush();
fw.close();
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream("out.txt"), "UTF-8"));
bw.write("第一行");
bw.newLine(); // 跨平台換行
bw.write("第二行");
bw.flush();
bw.close();
InputStreamReader/OutputStreamWriter 時顯式指定 "UTF-8",避免跨平台亂碼BufferedReader/BufferedWriter 批量處理,減少系統調用readLine():自動處理 \n、\r、\r\n 跨平台換行符StandardCharsets.UTF_8 替代字符串 "UTF-8",編譯期檢查
// 讀取所有行
List lines = Files.readAllLines(Paths.get("file.txt"), StandardCharsets.UTF_8);
// 流式處理大文件
try (Stream stream = Files.lines(Paths.get("file.txt"))) {
stream.filter(s -> s.contains("error")).forEach(System.out::println);
}
// 寫入
Files.write(Paths.get("out.txt"), Arrays.asList("line1", "line2"), StandardCharsets.UTF_8);
Files、Paths、StandardCharsets 讓文本處理更簡潔安全。