java中转换gbk文件为utf-8需显式指定字符集,推荐用inputstreamreader+outputstreamwriter包装字节流并配合try-with-resources;小文件可用files.readalllines/files.write简化操作。

Java 中读取 GBK 编码的文件并以 UTF-8 编码写入新文件,核心是**显式指定字符集**进行读写,避免依赖平台默认编码。关键在于用 InputStreamReader(读)和 OutputStreamWriter(写)包装字节流,并传入正确的 Charset。
使用 InputStreamReader + OutputStreamWriter(推荐)
这是最清晰、可控的方式,适合中小文件:
- 用
FileInputStream读取原始字节,再用InputStreamReader指定StandardCharsets.GBK解码为字符串 - 用
FileOutputStream写入字节,再用OutputStreamWriter指定StandardCharsets.UTF_8编码字符串 - 务必使用
try-with-resources自动关闭资源,防止乱码或文件损坏
import java.io.*;
import java.nio.charset.StandardCharsets;
public class GbkToUtf8 {
public static void convert(String gbkFilePath, String utf8FilePath) throws IOException {
try (InputStreamReader reader = new InputStreamReader(
new FileInputStream(gbkFilePath), StandardCharsets.GBK);
OutputStreamWriter writer = new OutputStreamWriter(
new FileOutputStream(utf8FilePath), StandardCharsets.UTF_8)) {
int c;
while ((c = reader.read()) != -1) {
writer.write(c);
}
}
}
}
使用 Files 类(简洁,适合文本内容不大的文件)
Files.readAllLines() 和 Files.write() 内部自动处理编码,代码更短:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
readAllLines(path, GBK)一次性读成List<string></string> -
write(path, lines, UTF_8)直接写入 UTF-8 文件 - 注意:该方式会将整个文件加载进内存,大文件(如 >100MB)慎用
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class GbkToUtf8Simple {
public static void convert(String gbkPath, String utf8Path) throws IOException {
List<string> lines = Files.readAllLines(Paths.get(gbkPath), StandardCharsets.GBK);
Files.write(Paths.get(utf8Path), lines, StandardCharsets.UTF_8);
}
}</string>
处理 BOM(可选)
某些 GBK 文件可能含 Windows 风格 BOM(虽然少见),而 UTF-8 文件有时需加 BOM(如部分旧版 Windows 工具要求)。Java 默认不写 BOM:
- 若需输出带 BOM 的 UTF-8,可在写入前手动写入
0xEF 0xBB 0xBF字节数组 - 若输入 GBK 文件含非法 BOM,
InputStreamReader通常能跳过,无需额外处理
验证是否成功
转换后建议验证结果:
- 用支持编码识别的编辑器(如 VS Code、Notepad++)打开新文件,确认显示为 UTF-8 且中文不乱码
- 命令行下可用
file -i filename(Linux/macOS)或chcp+ 观察显示效果(Windows)辅助判断 - 避免用记事本直接打开原 GBK 文件再“另存为 UTF-8”——它可能二次转码出错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










