记一次java生成csv文件乱码的解决过程 (GB2312编码)

系统:win7 (格式:中文(简体,中国))

工具:Eclipse (默认编码utf-8)

服务两个:【restful接口】  和 【服务*** server】。

场景:【服务*** server】多次调用【restful接口】,每次【restful接口】会返回一个生成好的csv文件内容。【服务*** server】将每次【restful接口】返回的csv内容保存成一个csv文件。并将生成的多个csv文件打包成一个zip压缩包。

【restful接口】:根据一组数据生成csv文件

1. java代码生成csv文件,文件输出流编码设置为"UTF-8"时,生成的csv文件打开后,中文乱码。

2. 将文件输出流编码设置为"GB2312",生成的csv文件打开后,中文没有乱码。

java代码如下:

    /**
     * 生成.csv格式文件
     */
    public static boolean createCsvFile(List<Object[]> rows, String filePath, String fileName) {
        // 标记文件生成是否成功
        boolean flag = true;

        // 文件输出流
        BufferedWriter fileOutputStream = null;

        try {
            // 含文件名的全路径
            String fullPath = filePath + File.separator + fileName + Constants.SUFFIX_CSV;

            File file = new File(fullPath);
            if (!file.getParentFile().exists()) { // 如果父目录不存在,创建父目录
                file.getParentFile().mkdirs();
            }
            if (file.exists()) { // 如果已存在,删除旧文件
                file.delete();
            }
            file = new File(fullPath);
            file.createNewFile();

            // 格式化浮点数据
            NumberFormat formatter = NumberFormat.getNumberInstance();
            formatter.setMaximumFractionDigits(10); // 设置最大小数位为10

            // 格式化日期数据
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

            // 实例化文件输出流
            fileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "GB2312"), 1024);

            // 遍历输出每行
            Iterator<Object[]> ite = rows.iterator();
            while (ite.hasNext()) {
                Object[] rowData = (Object[]) ite.next();
                for (int i = 0; i < rowData.length; i++) {
                    Object obj = rowData[i]; // 当前字段
                    // 格式化数据
                    String field = "";
                    if (null != obj) {
                        if (obj.getClass() == String.class) { // 如果是字符串
                            field = (String) obj;
                        } else if (obj.getClass() == Double.class || obj.getClass() == Float.class) { // 如果是浮点型
                            field = formatter.format(obj); // 格式化浮点数,使浮点数不以科学计数法输出
                        } else if (obj.getClass() == Integer.class || obj.getClass() == Long.class
                                || obj.getClass() == Short.class || obj.getClass() == Byte.class) { // 如果是整形
                            field += obj;
                        } else if (obj.getClass() == Date.class) { // 如果是日期类型
                            field = sdf.format(obj);
                        }
                    } else {
                        field = " "; // null时给一个空格占位
                    }
                    // 拼接所有字段为一行数据
                    if (i < rowData.length - 1) { // 不是最后一个元素
                        fileOutputStream.write("\"" + field + "\"" + ",");
                    } else { // 是最后一个元素
                        fileOutputStream.write("\"" + field + "\"");
                    }
                }
                // 创建一个新行
                if (ite.hasNext()) {
                    fileOutputStream.newLine();
                }
            }
            fileOutputStream.flush();
        } catch (Exception e) {
            flag = false;
            log.error("生成数据文件是报错!", e);
            e.printStackTrace();
        } finally {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return flag;
    }

【服务*** server】:通过restful接口来获取csv文件内容,并保存成csv文件

1. 【restful接口】通过流读取用"GB2312"编码生成的csv文件,此时数据流的编码是个仍旧是"GB2312".

2. 【服务*** server】通过【restful接口】来获取csv文件内容,因为 服务【服务*** server】的默认编码是"iso-8859-1"。此时接受到的csv内容编码由"GB2312"被强转成了"iso-8859-1". 此时,Eclipse中debug看到的csv内容中文是乱码的。

3. 【服务*** server】侧,重新编码csv内容,使汉字不再乱码。

// content是接收到的csv内容的字符串(String类型)content = convertEncodingFormat(content, "iso-8859-1", "GB2312");

4.  【服务*** server】如果想在本地将接收到的csv文件保存起来,并且中文可见。还需要设置输出流编码设置为"GB2312"。

    /**
     * 把内容写入文件csv,因为csv使用GB2312编码,需要单独处理
     */
    @SuppressWarnings("resource")
    public static boolean createCsvFileWithContent(String parentPath, String fileName, String contentStr) {
        // 标记文件生成是否成功
        boolean flag = true;

        // 拼接文件完整路径
        String fullPath = parentPath + File.separator + fileName;

        // 文件输出流
        BufferedWriter fileOutputStream = null;

        // 生成json格式文件
        try {
            //
            File file = new File(fullPath);
            if (!file.getParentFile().exists()) { // 如果父目录不存在,创建父目录
                file.getParentFile().mkdirs();
            }
            if (file.exists()) { // 如果已存在,删除旧文件
                file.delete();
            }
            file = new File(fullPath);
            file.createNewFile();

            // 实例化文件输出流
            fileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "GB2312"), 1024);
            fileOutputStream.write(contentStr);
            fileOutputStream.flush();
        } catch (Exception e) {
            flag = false;
            log.error("生成数据文件是报错!", e);
            e.printStackTrace();
        }

        // 返回是否成功的标记
        return flag;
    }

至此结束。

时间: 2024-12-27 11:57:56

记一次java生成csv文件乱码的解决过程 (GB2312编码)的相关文章

POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解

http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280.html . Office2007与Office Open XML 在Office 2007之前,Office一直都是以二进制位的方式存储,但这种格式不易被其它软件拿来使用,在各界的压力下,MicroSoft于2005年发布了基于XML的ooxml开放文档标准.ooxml的xml schema强调减

Java生成CSV文件实例详解

本文实例主要讲述了Java生成CSV文件的方法,具体实现步骤如下: 1.新建CSVUtils.java文件: package com.saicfc.pmpf.internal.manage.utils; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputS

java生成CSV文件

内容简介 本文内容使用java实现数据生成CSV文件,有关CSV文件知识请参考:CSV (逗号分隔值文件格式) 实现代码(仅供参考,请根据实现情况来修改) /** * 坐标点参数实体类 */ public class PointsParamDto { /** * 坐标id(由1开始,累加1,这样的:1,2,3,4,5...) */ private String pointId; /** * X 坐标点 */ private String x; /** * X 坐标点 */ private Str

java 生成 csv文件

一.csv文件 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据.CSV文件由任意数目的记录组成,记录间以某种换行符分隔:每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符.通常,所有记录都有完全相同的字段序列. CSV是一种通用的.相对简单的文件格式,被用户.商业和科学广泛应用.最广泛

java将数据生成csv文件

1,httpRequest接口触发进程[或者可以换成其他方式触发] /** * 出入库生成CSV文件 * @param req * @param params * @return */@RequestMapping(value = "explanCsvFileToOrder")ResponseMessage explanCsvFileToOrder(HttpServletRequest req, @RequestParam Map<String, String> param

java 对CSV 文件的读取与生成

CSV文件是以逗号分隔值的文件格式,一般用WORDPAD或记事本(NOTE),EXCEL打开.CSV(逗号分隔值)是一种用来存储数据的纯文本文件,通常都是用于存放电子表格或数据的一种文件格式,对于CSV文件的读取与生成其实很简单,只要读取的时候用(,)进行切割就可以获得相应的列元素,在生成的时候不同的列元素之间加上(,) demo如下: //读取CSV文件 public void readCsvFile(String fileName) throws IOException { Buffered

CSV文件写入,解决汉字乱码

    /**  * @param userInfoMap 注册用户的相关信息  * @throws IOException FileNotFoundException  * @return 将用户信息写入csv文件中  */ public static void WriteCSV(Map<String,String> userInfoMap){ try { // 存储经销商ID和经销商微信信息的文件路径 String csvPath = FileUtil.getWorkingPath() .

使用commons-csv生成.csv文件

做个代码笔记,方便以后看. commons-csv-1.1.jar的源码:https://github.com/apache/commons-csv CsvFileBuilder.java类 package com.huihui.main; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; im

PHP 生成.csv 文件并下载到浏览器

最近做了一个项目需要把订单的信息显示出来,并且能够把相关信息放到一个.csv 文件中,下载到浏览器.首先我要说明的是.csv 文件,PHP 有专门的函数去解析该类型的文件,相关函数大家可以去官网查看.注意.csv 文件内容的编码格式是gbk格式的,所以有必要对字符格式进行转码.文件的样式如下. 一.首先要定义header 头 // 输出Excel文件头,可把user.csv换成你要的文件名 header ( 'Content-Type: application/vnd.ms-excel' );