在Java开发中,使用FileWriter导出CSV文件是非常常见的操作,但不少开发者会发现导出的CSV文件中中文内容出现乱码,这本质上和FileWriter的默认编码机制有关。FileWriter本身没有提供直接设置编码格式的构造方法,它会默认使用当前操作系统的平台编码,比如Windows系统默认是GBK,而很多CSV读取工具默认使用UTF-8编码,编码不一致就会导致乱码问题。
FileWriter的编码限制
FileWriter是Java IO包中用于写入字符文件的便捷类,它的所有构造方法都没有编码参数,内部会默认使用系统默认的字符编码,开发者无法直接通过FileWriter本身指定编码格式。如果需要自定义编码,就不能直接使用FileWriter,需要借助其他支持编码设置的类来实现。
结合OutputStreamWriter指定编码
OutputStreamWriter是字符流到字节流的桥梁,它可以指定字符编码,我们可以将FileOutputStream和OutputStreamWriter结合使用,替代直接使用FileWriter,从而实现指定编码格式导出CSV。
实现步骤
- 创建FileOutputStream对象,指定要导出的CSV文件路径
- 创建OutputStreamWriter对象,传入FileOutputStream对象,并指定需要的编码格式,比如UTF-8
- 使用OutputStreamWriter写入CSV内容
- 最后关闭流释放资源
代码示例
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class CsvExportDemo {
public static void main(String[] args) {
String filePath = "D:/test.csv";
String encoding = "UTF-8";
// 创建文件输出流
try (FileOutputStream fos = new FileOutputStream(filePath);
// 创建指定编码的OutputStreamWriter
OutputStreamWriter osw = new OutputStreamWriter(fos, encoding)) {
// 写入CSV表头
osw.write("姓名,年龄,城市");
osw.write("n");
// 写入CSV内容
osw.write("张三,25,北京");
osw.write("n");
osw.write("李四,30,上海");
System.out.println("CSV导出成功,编码为:" + encoding);
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用BufferedWriter优化写入效率
如果CSV内容较多,直接使用OutputStreamWriter写入效率较低,可以搭配BufferedWriter来提升写入性能,BufferedWriter提供了缓冲功能,减少IO次数。
代码示例
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class CsvExportWithBuffer {
public static void main(String[] args) {
String filePath = "D:/test_buffer.csv";
String encoding = "UTF-8";
try (FileOutputStream fos = new FileOutputStream(filePath);
OutputStreamWriter osw = new OutputStreamWriter(fos, encoding);
BufferedWriter bw = new BufferedWriter(osw)) {
// 写入表头
bw.write("商品名,价格,库存");
bw.newLine();
// 写入内容
bw.write("笔记本电脑,4999,100");
bw.newLine();
bw.write("无线鼠标,99,500");
System.out.println("带缓冲的CSV导出成功,编码为:" + encoding);
} catch (IOException e) {
e.printStackTrace();
}
}
}
不同编码场景的选择
在实际开发中,需要根据CSV文件的接收方需求选择编码格式:
- 如果CSV文件主要给Windows系统的Excel打开,建议选择GBK编码,因为Excel在Windows下默认使用GBK打开CSV,避免乱码
- 如果CSV文件需要跨平台使用,或者给Web端、其他系统读取,建议选择UTF-8编码,兼容性更好
- 如果需要兼容旧系统,可能需要使用GB2312等其他编码,具体根据对接方要求确定
注意事项
在写入CSV内容时,如果字段中包含逗号、双引号等特殊字符,需要按照CSV的规范进行转义,比如字段包含逗号时,需要用双引号把整个字段包裹起来,避免CSV格式错乱。另外,流资源一定要正确关闭,使用try-with-resources语法可以自动关闭实现了AutoCloseable接口的资源,避免资源泄露。
注意:不要尝试通过反射等方式修改FileWriter的内部编码,这种方式不稳定,而且不同JDK版本可能有差异,不建议在生产环境使用。
FileWriterCSV导出编码格式乱码解决修改时间:2026-06-17 16:00:34