java中读取指定编码文本文件的关键是显式指定charset,推荐jdk7+用files.readalllines()或files.newbufferedreader()配合standardcharsets,jdk8+可用files.lines()流式处理,避免使用filereader以防默认编码导致乱码。

Java 中读取指定编码格式的文本文件,关键在于**显式指定字符集(Charset)**,避免依赖平台默认编码导致乱码。JDK 7+ 推荐使用 Files.readAllLines() 或 Files.newBufferedReader() 配合 StandardCharsets;JDK 8+ 还可结合 Files.lines() 流式处理。
使用 Files.readAllLines() 一次性读取全部行
适合小到中等大小的文件,返回 List<string></string>,代码简洁安全:
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
List<string> lines = Files.readAllLines(Paths.get("data.txt"), StandardCharsets.UTF_8);
// 或用字符串名:Files.readAllLines(Paths.get("data.txt"), "GBK");
</string>
- 推荐优先使用
StandardCharsets.UTF_8等常量,类型安全、无异常风险 - 若传入字符串编码名(如
"UTF-8"或"GBK"),需捕获UnsupportedEncodingException(实际极少发生) - 该方法会自动关闭资源,无需手动 try-with-resources
使用 BufferedReader 按行读取(推荐大文件或需逐行处理)
更灵活、内存友好,尤其适合大文件或需要条件处理每行内容的场景:
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
List<string> lines = new ArrayList();
try (var reader = Files.newBufferedReader(Paths.get("data.txt"), StandardCharsets.GBK)) {
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
// 可在此处做解析、过滤等操作
}
}
</string>
-
Files.newBufferedReader()返回带缓冲的BufferedReader,性能优于老式InputStreamReader + FileReader - 务必用 try-with-resources 确保流正确关闭
- 支持任意
Charset,如StandardCharsets.UTF_16、Charset.forName("ISO-8859-1")
使用 Files.lines() 流式处理(JDK 8+,适合函数式风格)
返回 Stream<string></string>,适合链式操作(filter/map/collect),但注意必须关闭流:
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
try (Stream<string> stream = Files.lines(Paths.get("log.txt"), StandardCharsets.UTF_8)) {
stream.filter(s -> s.contains("ERROR"))
.forEach(System.out::println);
} // 自动关闭
</string>
- 不收集到集合时内存占用低,适合日志分析、ETL 类场景
- 必须显式用 try-with-resources 包裹,否则流未关闭可能引发资源泄漏
- 若后续需多次遍历,需先
collect(Collectors.toList())
常见编码说明与注意事项
中文环境常见编码有 UTF-8、GBK、GB2312、UTF-16BE/LE。选择依据是文件实际保存时使用的编码:
- UTF-8 是国际通用首选,无 BOM 或带 BOM 均可被正确识别(但部分旧工具写入的 UTF-8+BOM 需额外处理)
- Windows 记事本保存为“ANSI”时,中文系统下通常是 GBK;保存为“UTF-8”时可能带 BOM(0xEF 0xBB 0xBF),Java 默认能跳过
- 不确定编码时,可用工具(如 notepad++、vscode)先查看文件真实编码,再在代码中指定
- 避免使用
FileReader——它始终用平台默认编码,极易出错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











