解决java下载csv中文乱码(加BOM头) 推荐第二种方法

使用csvWriter需要引入依赖:


       <!-- https://mvnrepository.com/artifact/net.sourceforge.javacsv/javacsv -->
<dependency>
    <groupId>net.sourceforge.javacsv</groupId>
    <artifactId>javacsv</artifactId>
    <version>2.0</version>
</dependency>
 File file = File.createTempFile("vehicle", ".csv");
            
            CsvWriter csvWriter = new CsvWriter(file.getAbsolutePath(), ',', Charset.forName("utf-8"));
            //CsvWriter csv = new CsvWriter(file.getPath());
            String[] headers = {"姓名","年龄","编号","性别","sex"};
            csvWriter.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));
            csvWriter.writeRecord(headers,false);
            /*//csv.writeRecord(headers);
            System.out.println(file.getParent());
            System.out.println(file.getAbsolutePath());
            System.out.println(file.getCanonicalPath());*/
            System.out.println(file.getPath());
            csvWriter.close();

解释:  代码中生成的utf-8文件没有加BOM(byte order marker 字节序列标示) 而微软的csv文件默认是有bom标示的,因此  Java代码生成的csv文件中的中文字被标示为??等.  所以解决的办法就是在文件的开头添加BOM标示就可以.

csvWriter.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));

或者加在要写出的内容前如:     String[] headers = {new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }),"姓名","年龄","编号","性别","sex"};

然而,第一种方法的缺点在于会在文件头部生成多余的空白字符,  所以推荐使用第二种方法:

第二种方法是用流的方式完美解决,如下

 File file = File.createTempFile("vehicle", ".csv");
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF});
            CsvWriter csvWriter = new CsvWriter(fos, ',', Charset.forName("utf-8"));
            String[] headers = {"姓名","年龄","编号","性别","sex"};
            csvWriter.writeRecord(headers);
            csvWriter.close();

先把标示符号用流的方式传过去  这样文件内就会把他识别为标示  而不是标示字符串, 后面就可以传递自己需要的内容啦

 

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值