Java 7 引入 java.nio.file.Files 簡化文件操作,Java 8 進一步結合 Stream API 讓讀取文件變得極其簡潔。本文系統梳理各種「一行代碼」讀取姿勢及避坑指南。
| 方法 | 返回類型 | 適用場景 | 編碼處理 |
|---|---|---|---|
Files.readAllBytes(Path) | byte[] | 小文件整體讀取 | 需手動指定 new String(bytes, StandardCharsets.UTF_8) |
Files.readAllLines(Path, Charset) | List<String> | 按行讀取需隨機訪問 | Java 8 默認 UTF-8,可顯式指定 |
Files.lines(Path, Charset) | Stream<String> | 大文件流式處理、管道操作 | 默認 UTF-8,支援自定義 Charset |
// Java 7 風格
String content = new String(Files.readAllBytes(Paths.get("D:/jd.txt")), StandardCharsets.UTF_8);
// Java 8 靜態導入極簡寫法
import static java.nio.file.Files.readAllBytes;
import static java.nio.file.Paths.get;
import static java.lang.System.out;
out.println(new String(readAllBytes(get("d:/jd.txt"))));
List<String> lines = Files.readAllLines(Paths.get("D:/jd.txt"), StandardCharsets.UTF_8);
// 處理邏輯...
String full = String.join("", lines);
Files.lines(Paths.get("D:/jd.txt"), StandardCharsets.UTF_8)
.forEach(System.out::println);
// 進階:過濾、轉換、收集
List<String> keywords = Files.lines(path, StandardCharsets.UTF_8)
.filter(line -> line.contains("error"))
.map(String::trim)
.collect(Collectors.toList());
readAllBytes/readAllLines 會將整個文件載入記憶體,嚴禁用於大文件(>100MB),請改用 Files.lines() 流式處理。StandardCharsets.UTF_8),若文件為 GBK/ANSI 需對應調整,否則會拋 MalformedInputException。Files.lines() 返回的 Stream 實現了 AutoCloseable,建議使用 try-with-resources:
try (Stream<String> stream = Files.lines(path, StandardCharsets.UTF_8)) {
stream.forEach(System.out::println);
}
NoSuchFileException,需捕獲處理或檢查 Files.exists(path)。readAllBytes + 字串構造最簡潔。Files.lines() + Stream API 既優雅又高效。Files.lines() 配合 try-with-resources。