应显式指定 utf-8 编码:优先用 tostring(standardcharsets.utf_8)(jdk 7+,类型安全无异常),次选用 tostring("utf-8")(需处理 unsupportedencodingexception);禁用无参 tostring(),因其依赖平台默认编码(如 windows 的 gbk),易致跨环境中文乱码。

Java 中 ByteArrayOutputStream.toString() 默认使用平台默认编码,不指定 UTF-8。要以 UTF-8 编码转字符串,必须显式传入字符集名称或 Charset 对象。
使用 toString(String charsetName) 方法
这是最常用的方式,直接传入字符集名称字符串:
-
toString("UTF-8")—— 传入字符串字面量,注意大小写(推荐用"UTF-8",不是"utf8"或"utf-8") - 该方法在 JDK 1.1+ 就已支持,兼容性好
- 若字符集名不合法(如拼错),会抛出
UnsupportedEncodingException
使用 toString(Charset charset) 方法(JDK 1.7+)
更类型安全、推荐的方式,避免拼写错误:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
toString(StandardCharsets.UTF_8)—— 使用java.nio.charset.StandardCharsets中的静态常量 - 无需异常处理,因为
StandardCharsets.UTF_8是编译期确定的有效 Charset - JDK 7 引入,现代项目建议优先使用
不要依赖无参 toString() 方法
无参版本 toString() 内部调用 new String(buf, 0, count),实际使用 String.decode(),其编码由 Charset.defaultCharset() 决定:
- Windows 系统通常是
GBK,Linux/macOS 通常是UTF-8,行为不可控 - 跨环境运行时极易出现中文乱码,尤其涉及网络传输或文件存储时
- 即使本地测试正常,上线后也可能因服务器环境不同而失败
完整示例代码
推荐写法(JDK 7+):
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write("你好".getBytes(StandardCharsets.UTF_8));
String s = baos.toString(StandardCharsets.UTF_8); // ✅ 正确
// 或
String s2 = baos.toString("UTF-8"); // ✅ 也可,但需捕获异常(可选)
如果必须用字符串参数且 JDK 版本较老,记得加异常处理:
try {
String s = baos.toString("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










