java转换文本文件编码的核心是按源编码读取、目标编码写出,需确认真实源编码、手动处理bom、使用files.newbufferedreader/writer并指定charset。

Java 中转换不同字符编码的文本文件,核心是读取时按源编码解码、写入时按目标编码编码。关键不是“转换编码”,而是用正确的编码重新读写内容。
确认原始文件的真实编码
很多乱码问题源于误判源编码。不能只看文件后缀或编辑器默认设置。可用工具如 notepad++(编码菜单查看)、iconv -f utf-8 -t utf-8//test file.txt(Linux/macOS 测试),或 Java 中尝试不同编码读取并检查是否出现符号。
- 常见编码:UTF-8(无BOM)、UTF-8-BOM、GBK、ISO-8859-1、UTF-16BE/LE
- Windows 记事本保存的“UTF-8”通常带 BOM;Java 的
StandardCharsets.UTF_8默认不处理 BOM,需手动跳过 - 若原始文件是 GBK 编码却用 UTF-8 读,会出现乱码;反之亦然
用指定编码读取再用新编码写出
这是最稳妥、最常用的方式。不依赖文件自身声明(文本文件本身不存编码信息),完全由程序控制。
- 使用
InputStreamReader指定源编码读取字节流 - 用
OutputStreamWriter指定目标编码写入字节流 - 推荐搭配
Files.newBufferedReader和Files.newBufferedWriter,简洁且自动关闭资源
示例:将 GBK 编码的文件转为 UTF-8
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Path src = Paths.get("input.txt");
Path dst = Paths.get("output_utf8.txt");
// 按 GBK 读,按 UTF-8 写
try (BufferedReader reader = Files.newBufferedReader(src, Charset.forName("GBK"));
BufferedWriter writer = Files.newBufferedWriter(dst, StandardCharsets.UTF_8)) {
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
}
}
处理带 BOM 的 UTF 文件
UTF-8-BOM、UTF-16 文件开头有字节序标记(BOM),Java 原生 API 不自动识别,需手动处理,否则可能在首行多出怪字符(如 )。
- 读取前先探测前几个字节:EF BB BF → UTF-8-BOM;FF FE → UTF-16LE;FE FF → UTF-16BE
- 可封装一个跳过 BOM 的
InputStream,或用第三方库如 Apache Commons IO 的ByteOrderMark类 - 写入 UTF-8-BOM 时,需手动写入
new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF}
批量转换与命令行辅助
单个文件可用上述代码;大量文件建议封装工具类,加入异常捕获和日志。也可借助系统命令快速验证:
- Linux/macOS:
iconv -f GBK -t UTF-8 input.txt > output.txt - Windows PowerShell:
Get-Content input.txt -Encoding Default | Set-Content output.txt -Encoding UTF8(注意:Default ≈ 系统 ANSI,通常是 GBK) - Java 打成 jar 后,可通过
java -jar converter.jar --from GBK --to UTF-8 *.txt实现简单 CLI 工具
不复杂但容易忽略细节。只要明确源和目标编码、正确选用 Charset 实例、留意 BOM 和换行符,就能稳定完成转换。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










