outputstreamwriter结合fileoutputstream导出csv文件的核心是:1.用fileoutputstream写入字节,outputstreamwriter显式指定utf-8编码(推荐standardcharsets.utf_8)避免乱码;2.按csv规则转义字段(逗号、换行、双引号需包裹并转义),每行末用write("\n")换行;3.套bufferedwriter提升性能,配合try-with-resources确保flush和close;4.解决excel中文乱码可加utf-8 bom(\ufeff)或引导用户导入时选utf-8编码。

OutputStreamWriter 结合 FileOutputStream 导出 CSV 文件,核心是用 FileOutputStream 提供底层字节流,再用 OutputStreamWriter 做字符编码转换(比如 UTF-8),最后通过 BufferedWriter 或直接 write() 写入 CSV 格式文本。
1. 创建带编码的 OutputStreamWriter
FileOutputStream 负责写入文件字节,但不处理字符编码;OutputStreamWriter 作为桥梁,把字符串按指定编码转成字节。务必显式指定编码(如 "UTF-8"),避免中文乱码。
- 不要依赖平台默认编码(如 Windows 的 GBK),否则导出的 CSV 在其他系统可能打不开
- 推荐写法:new OutputStreamWriter(new FileOutputStream("data.csv"), StandardCharsets.UTF_8)
- Java 7+ 可直接用 StandardCharsets.UTF_8,比字符串 "UTF-8" 更安全
2. 按 CSV 规则写入数据(注意转义和换行)
CSV 不是简单用逗号拼接。字段含逗号、换行符或双引号时,必须用双引号包裹,且内部双引号要转义为两个双引号("")。
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 示例:原始值
"张三,研发部"→ 写成"\"张三,研发部\"" - 推荐封装一个简单的 escapeCsv 方法,对每个字段预处理
- 每行数据写完后,调用 write("\n") 换行(别用 println,它可能写系统换行符 \r\n,导致 Excel 打开错行)
3. 推荐搭配 BufferedWriter 提升性能
OutputStreamWriter 本身没有缓冲,频繁 write() 效率低。套一层 BufferedWriter,能减少磁盘 I/O 次数,尤其数据量大时明显。
- 写法:new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.csv"), StandardCharsets.UTF_8))
- 记得最后调用 flush() 和 close()(或用 try-with-resources 自动关闭)
- try-with-resources 示例:
writer.write("\"姓名\",\"部门\",\"入职日期\"\n");
writer.write("\"李四\",\"测试组\",\"2023-01-15\"\n");
}
4. 额外提醒:Excel 中文显示问题
即使用了 UTF-8,Excel 默认可能用 ANSI 打开 CSV,导致中文乱码。解决方法有两个:
- 在 CSV 文件开头写入 UTF-8 BOM(
\uFEFF),Excel 会识别为 UTF-8 编码(注意:不是所有程序都兼容 BOM) - 更稳妥的方式:导出后,让使用者用 Excel 的「数据 → 从文本/CSV」导入,并手动选 UTF-8 编码
- BOM 写法示例:writer.write("\uFEFF"); // 放在第一行前
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










