导读:本期聚焦于小伙伴创作的《如何使用FileWriter指定编码格式防止导出CSV时产生乱码》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何使用FileWriter指定编码格式防止导出CSV时产生乱码》有用,将其分享出去将是对创作者最好的鼓励。

在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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。