Java读取文本文件应按文件大小选择方式:小文件用Files.readAllLines()或Files.readAllBytes()并指定UTF-8编码;大文件必须用Files.newBufferedReader()配合try-with-resources逐行处理;禁用无编码声明的FileReader。

Java 读取文本文件,核心是选对方式:小文件直接加载,大文件流式处理;关键要控编码、管资源、避乱码。
小文件推荐用 Files.readAllLines()
适合 ≤10MB 的配置文件、日志片段、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;
立即学习“Java免费学习笔记(深入)”;
Path path = Paths.get("config.txt");
try {
List
// 后续可直接遍历、过滤、查找
} catch (IOException e) {
System.err.println("读取失败: " + e.getMessage());
}
需原始字节或探测编码时用 Files.readAllBytes()
返回 byte[],适合后续做编码自动识别、混合二进制处理,或转字符串时自行控制解码逻辑:
- 读完后需手动用指定编码构造字符串:new String(bytes, StandardCharsets.UTF_8)
- 同样只适用于小文件,禁用于大文件(易 OOM)
大文件或逐行处理必须用 BufferedReader
避免内存溢出,支持边读边处理,推荐搭配 Files.newBufferedReader():
- 用 Files.newBufferedReader(path, StandardCharsets.UTF_8) 构造,编码明确、路径简洁
- 务必用 try-with-resources 自动关闭,否则可能锁文件或耗尽句柄
- readLine() 返回 null 表示到末尾,返回 "" 表示空行
示例:
try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line); // 或解析、统计、过滤等
}
} catch (IOException e) {
e.printStackTrace();
}
慎用 FileReader,基本不推荐
它不支持显式指定编码,Windows 默认 GBK,Linux/macOS 默认 UTF-8,极易乱码:
- 若非不得已,不要单独用 FileReader
- 非要配合 BufferedReader,也得先套一层 InputStreamReader + UTF_8
- 真正安全的写法是:new BufferedReader(new InputStreamReader(new FileInputStream("x.txt"), "UTF-8"))
一句话:优先 Files 工具类,次选带明确编码的 BufferedReader,绕开 FileReader。


















