java中按指定字符集写入文本需用outputstreamwriter包装fileoutputstream并传入charset,或用files.write指定编码;禁用无参getbytes和默认filewriter以防乱码。

Java 中按指定字符集写入文本内容,关键在于使用支持编码参数的输出类,并确保字节流或字符流明确指定字符集(Charset),避免依赖平台默认编码。
使用 FileWriter + OutputStreamWriter 指定编码
FileWriter 本身不支持直接传入 Charset,需配合 OutputStreamWriter 使用。这是最常用且推荐的方式:
- 先创建 FileOutputStream 指向目标文件
- 用 OutputStreamWriter 包装它,并传入 Charset(如 StandardCharsets.UTF_8)
- 再用 BufferedWriter 提升写入效率(可选但建议)
示例代码:
try (FileOutputStream fos = new FileOutputStream("output.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
BufferedWriter writer = new BufferedWriter(osw)) {
writer.write("你好,世界!"); // 写入中文不会乱码
} catch (IOException e) {
e.printStackTrace();
}
使用 Files.write()(Java 7+,简洁高效)
Files 工具类提供一行式写入,自动处理资源和编码,适合简单场景:
- 接收 Path、字节数组(或字符串)、Charset
- 内部已封装好编码转换与流关闭逻辑
- 注意:若内容含换行符,需自行添加 \n 或使用 Files.write 配合 List
示例:
String content = "Hello 世界";
try {
Files.write(Paths.get("output.txt"), content.getBytes(StandardCharsets.UTF_8));
// 或更推荐的重载版本(自动编码):
Files.write(Paths.get("output.txt"), content.getBytes(), StandardCharsets.UTF_8);
} catch (IOException e) {
e.printStackTrace();
}
避免常见陷阱
以下做法容易导致乱码或异常,需特别注意:
- 别用纯 FileWriter("xxx.txt") 写中文:它默认用系统平台编码(如 Windows 的 GBK),跨平台易出错
- 别混用 getBytes() 无参方法:String.getBytes() 使用平台默认编码,与写入时实际编码不一致就会乱码
- 别忽略异常或静默吞掉 IOException:写入失败可能因磁盘满、权限不足等,应妥善处理
- 写入前确认目标目录存在:Files.write 不会自动创建父目录,需提前调用 Files.createDirectories()
进阶:自定义编码写入并追加内容
若需在文件末尾追加(而非覆盖),只需在 FileOutputStream 构造时启用 append 模式,并保持编码一致:
try (FileOutputStream fos = new FileOutputStream("log.txt", true); // true 表示追加
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
BufferedWriter writer = new BufferedWriter(osw)) {
writer.write("[INFO] " + LocalDateTime.now());
writer.newLine(); // 手动换行
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











