Files.readAllLines()是Java中读取文本文件所有行到List<String>的最简洁方式,需显式指定StandardCharsets.UTF_8编码并捕获IOException,适用于中小文件(≤100MB)。

使用 Files.readAllLines() 是 Java 中读取文本文件所有行到 List<String> 的最简洁方式,无需手动处理流或循环,但需注意编码和异常处理。
基本用法:指定路径和默认编码
该方法会将文件按行读取,每行作为字符串存入 ArrayList,默认使用 UTF-8 编码(Java 11+),Java 7–10 默认为系统默认编码(不推荐依赖):
import java.nio.file.*;
import java.util.List;
Path path = Paths.get("data.txt");
List<String> lines = Files.readAllLines(path); // Java 11+ 默认 UTF-8
显式指定字符编码(强烈推荐)
避免乱码的关键是显式传入 StandardCharsets.UTF_8,尤其当文件含中文、emoji 或跨平台时:
import java.nio.charset.StandardCharsets; List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
- 不要依赖系统默认编码,Windows 常为 GBK,Linux/macOS 多为 UTF-8
- 若文件实际编码不是 UTF-8(如 GB2312),需换用对应 Charset,例如
Charset.forName("GB2312")
异常处理必须到位
readAllLines() 抛出 IOException(如文件不存在、无权限、磁盘满等),必须捕获或声明:
立即学习“Java免费学习笔记(深入)”;
try {
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
lines.forEach(System.out::println);
} catch (IOException e) {
System.err.println("读取文件失败:" + e.getMessage());
}
- 不建议直接抛出
throws IOException到上层,除非业务逻辑明确由调用方处理 - 可结合
Files.exists()提前检查文件是否存在,提升错误提示友好性
适用场景与注意事项
该方法适合中小文件(通常 ≤ 100MB),因它会一次性将全部内容加载进内存:
- 优点:代码极简、自动关闭资源、天然支持 NIO 路径
- 缺点:大文件易引发
OutOfMemoryError;无法跳过空行或做实时过滤 - 替代方案:超大文件请用
Files.lines()配合 Stream 处理,例如Files.lines(path).filter(s -> !s.isBlank()).toList()


















