files.readalllines()和readallbytes()是java中读取小文件(≤10mb)最简洁方式,前者返回list适用于按行处理,后者返回byte[]适合需原始字节或编码探测的场景;均须显式指定standardcharsets.utf_8并捕获ioexception,禁用于大文件或需流式处理的情形。

Java 中用 Files 工具类读取文本文件,最直接的方式就是调用 readAllLines() 读所有行,或 readAllBytes() 读全部字节。两者都适合小文件(一般 ≤10MB),代码简洁、自动管理资源,但关键细节必须到位——尤其是编码和异常处理。
读取所有行到 List
适用于按行处理的场景,比如配置文件、日志片段、CSV 前几行预览等。
- 必须显式指定字符集,推荐
StandardCharsets.UTF_8,避免 Windows 下默认 GBK 导致中文乱码 - 路径用
Paths.get("xxx.txt"),不要用new File(...).toPath() - 必须捕获
IOException:文件不存在、无读权限、磁盘满等情况都会抛出 - 示例写法:
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
Path path = Paths.get("config.txt");
try {
List
// 后续可直接遍历、过滤、查找
} catch (IOException e) {
System.err.println("读取失败:" + e.getMessage());
}
读取全部字节再转字符串
适合需要原始字节操作,或后续要做编码探测、二进制混合处理的场景。
-
readAllBytes()返回byte[],需手动用指定编码构造字符串 - 同样要传
StandardCharsets.UTF_8(或其他实际编码),不能依赖new String(bytes)默认构造 - 对含 BOM 的 UTF-8 文件,
String构造会自动处理,无需额外剥离
byte[] bytes = Files.readAllBytes(path);
String content = new String(bytes, StandardCharsets.UTF_8);
哪些情况不适合用这两个方法
它们是一次性加载全部内容到内存,所以有明确限制:
- 文件超过 50–100MB 时,容易触发
OutOfMemoryError - 需要跳过空行、过滤注释、实时解析结构化数据(如 JSON 行)时,无法边读边处理
- 文件可能被其他进程持续写入(如日志追加),
readAllLines()会读到截断状态,不保证一致性
大文件或特殊需求的替代方案
不是“不能用”,而是“不该硬扛”。现代 Java 提供更合适的工具:
- 逐行流式处理:用
Files.lines(path, UTF_8)返回Stream<string></string>,配合filter、map、limit等操作,记得 try-with-resources 或显式 close - 高性能逐行读:
BufferedReader配合Files.newBufferedReader(),适合复杂逻辑(如状态机解析) - 超大纯文本(GB 级):考虑分块读取或内存映射(
FileChannel.map),但需谨慎评估必要性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











