Java读写文本文件应优先使用try-with-resources+BufferedReader/BufferedWriter+StandardCharsets.UTF_8,显式指定UTF-8编码并自动管理资源,避免乱码和数据丢失。

Java 中用 Reader 和 Writer 读写文本文件,核心是按字符(char)单位操作,自动处理编码转换,避免字节流直接读中文时的乱码问题。关键不在“能不能用”,而在于“怎么指定编码”和“要不要加缓冲”。
读取文本:用 Reader 链式组合,重点在编码和缓冲
直接用 FileReader 最简单,但它默认用系统编码(如 Windows 是 GBK),遇到 UTF-8 文件极易乱码。推荐显式指定编码,并套上 BufferedReader 提升效率:
- 用
InputStreamReader+FileInputStream明确控制编码:new BufferedReader(new InputStreamReader(new FileInputStream("data.txt"), StandardCharsets.UTF_8)) - Java 11+ 可直接用
FileReader带编码构造器:new BufferedReader(new FileReader("data.txt", StandardCharsets.UTF_8)) - 逐行读最常用:
String line; while ((line = br.readLine()) != null) { ... },readLine()自动去掉换行符
写入文本:用 Writer 配合 flush 或自动刷新
Writer 默认带缓冲,数据不会立刻落盘。不调 flush() 或 close(),内容可能丢失:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 基础写法(需手动 flush):
try (FileWriter fw = new FileWriter("out.txt", StandardCharsets.UTF_8)) { fw.write("你好"); fw.flush(); } - 更稳妥用
OutputStreamWriter+ 编码:new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt"), StandardCharsets.UTF_8)) - 想写完自动刷(适合日志等场景):
new PrintWriter(new FileWriter("log.txt"), true),第二个参数true表示自动 flush
编码问题:90% 的乱码都源于这里
文本文件本身有编码(如记事本保存时选的 UTF-8 / ANSI),程序读写时必须匹配。常见错误:
立即学习“Java免费学习笔记(深入)”;
- 文件是 UTF-8,却用默认
FileReader(系统编码 GBK)读 → 出现 “ä½ å¥½” - 写入时没指定编码,读取端用不同编码打开 → 文字错位或方块
- 解决方案统一:所有涉及编码的地方,显式传
StandardCharsets.UTF_8(推荐 UTF-8 全局统一)
实际建议:优先用 try-with-resources + 缓冲 + UTF-8
这是现代 Java 开发中最安全、简洁、不易出错的写法:
- 读文件:
try (BufferedReader br = new BufferedReader(new FileReader("in.txt", StandardCharsets.UTF_8))) { ... } - 写文件:
try (BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt", StandardCharsets.UTF_8))) { bw.write("测试"); } - 不用手动
close()或flush(),try-with-resources 会自动处理

















