Java 7 引入 java.nio.file.Files 和 Path,Java 8 再加上 Stream API,使文件讀取極其簡潔高效。本文展示從「讀全文件為字符串」到「流式逐行處理」的各種一行代碼寫法。
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Stream;
// Java 7+ : Files.readAllBytes -> String (默認 UTF-8)
String content = new String(Files.readAllBytes(Paths.get("data.txt")));
// Java 11+ : 更簡潔的 Files.readString (自動 UTF-8)
String content = Files.readString(Paths.get("data.txt"));
// Java 7+ : 指定編碼
List lines = Files.readAllLines(Paths.get("data.txt"), StandardCharsets.UTF_8);
// Java 11+ : 自動 UTF-8
List lines = Files.readAllLines(Paths.get("data.txt"));
// Java 8+ : Files.lines() 返回 Stream,自動關閉資源 (需 try-with-resources)
try (Stream stream = Files.lines(Paths.get("data.txt"), StandardCharsets.UTF_8)) {
stream.forEach(System.out::println); // 打印每行
// 或進行過濾、映射、聚合等流操作
long count = stream.filter(l -> l.contains("error")).count();
}
// Java 11+ : 更簡潔 (隱式 try-with-resources 不支持,仍需 try 塊)
// 但可寫為一行邏輯:
Files.lines(Paths.get("data.txt")).forEach(System.out::println); // 簡略寫法,異常拋出
// 寫入字符串列表 (覆蓋模式)
Files.write(Paths.get("out.txt"), lines, StandardCharsets.UTF_8);
// 寫入單個字符串 (追加模式)
Files.writeString(Paths.get("out.txt"), "新內容\n", StandardCharsets.UTF_8, StandardOpenOption.APPEND);
Files.lines() 返回的 Stream 實現了 AutoCloseable,配合 try-with-resources 確保文件句柄及時釋放。Files.lines() 惰性讀取,適合大文件 (GB 級),不會一次性載入內存導致 OOM。filter/map/collect 等流操作,代碼聲明式、可讀性強。StandardCharsets.UTF_8 避免平台默認編碼差異導致亂碼。readAllBytes/readAllLines 會將整個文件載入內存,嚴禁用於大文件。NoSuchFileException,需捕獲處理。MalformedInputException 或產生亂碼,需確認文件編碼。\\ 或正斜杠 /。