目录

一、CSV文件的特点 

二、CSV的写入操作

三、CSV的读取操作

四、测试


一、CSV文件的特点 

1.CSV是“逗号分隔值文件格式”。
2.CSV每条记录由字段组成,每个字段之间一般使用逗号分割。
3.CSV通常都是纯文本的文件,意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据,常使用Excel或文本编辑工具打开。

二、CSV的写入操作

往csv文件里面新增内容,主要使用到文件输出流
FileOutputStream(String name, boolean append);
第一个参数为:csv的文件路径
第二个参数为:是否向文件里面追加内容(前提是第一个参数的文件已经存在)
下面是两种写入方式,第二种写入的效率高一点。

/**
     * 一行行向CSV写入内容
     *
     * @param head        标题
     * @param dataList    数据集合
     * @param csvFilePath 文件路径
     * @param append      是否向已存在的CSV追加内容
     */
    public static void writeDataListToCsv(String head, List<String> dataList, String csvFilePath, boolean append) {
        // 将流写在try里面,当try执行完之后,流会自动关闭
        try (FileOutputStream fileOutputStream = new FileOutputStream(csvFilePath, append);
             OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "GBK");
             BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter)) {
            if (StringUtils.isNotBlank(head)) {
                bufferedWriter.write(head);
                bufferedWriter.newLine();
            }
            // 将数据写入到文件中
            for (String rowStr : dataList) {
                if (StringUtils.isNotBlank(rowStr)) {
                    bufferedWriter.write(rowStr);
                    bufferedWriter.newLine();
                }
            }
            //把缓存中的数据输出到CSV文件
            bufferedWriter.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
/**
     * 一次性向CSV写入内容
     *
     * @param head        标题
     * @param dataStr     数据字符串
     * @param csvFilePath 文件路径
     * @param append      是否向已存在的CSV追加内容
     */
    public static void writeStringToCsv(String head, String dataStr, String csvFilePath, boolean append) {
        // 将流写在try里面,当try执行完之后,流会自动关闭
        try (FileOutputStream fileOutputStream = new FileOutputStream(csvFilePath, append);
             OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "GBK");
             BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter)) {
            if (StringUtils.isNotBlank(head)) {
                bufferedWriter.write(head);
                bufferedWriter.newLine();
            }

            // 将数据写入到文件中
            if (StringUtils.isNotBlank(dataStr)) {
                bufferedWriter.write(dataStr);
            }

            //把缓存中的数据输出到CSV文件
            bufferedWriter.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

三、CSV的读取操作

根据文件路径直接读取CSV每一行的数据

public static List<String> readFromCsv(String csvFilePath) {
        List<String> dataList = new ArrayList<>();
        File csvFile = new File(csvFilePath);
        // 如果文件不存在,直接返回
        if (!csvFile.exists()) {
            return dataList;
        }
        // 将流写在try里面,当try执行完之后,流会自动关闭
        try (InputStream inputStream = Files.newInputStream(csvFile.toPath());
             InputStreamReader fileReader = new InputStreamReader(inputStream, "GBK");
             BufferedReader buffReader = new BufferedReader(fileReader)) {
            String line;
            while ((line = buffReader.readLine()) != null) {
                if (StringUtils.isNotBlank(line)) {
                    dataList.add(line);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dataList;
    }

四、测试

1. 构造写入CSV的数据,一个是字符串的数据形式,一个是字符串集合的数据形式

/**
     * 获取写入CSV的数据
     *
     * @return List<String> 每行为一个字符串
     */
    private static List<String> getCsvDataList() {
        List<String> dataList = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            dataList.add(String.format("编号%d,员工%d,部门%d", i, i, i));
        }
        return dataList;
    }

    /**
     * 获取写入CSV的数据
     *
     * @return String 写入CSV的内容拼装成一个字符串的
     */
    private static String getCsvDataStr() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 100; i++) {
            sb.append(String.format("编号%d,员工%d,部门%d", i, i, i)).append('\r').append('\n');
        }
        return sb.toString();
    }

  2. 分别测试两种写入CSV方式的性能及内容追加和CSV文件内容的读取

public static void main(String[] args) {
        String head = "员工编码,员工名称,员工部门";

        // 一行行数据写入CSV
        String filePath1 = "D:\\myfile\\employee1.csv";
        List<String> dataList = getCsvDataList();
        long writeDataListToCsvTime = System.currentTimeMillis();
        writeDataListToCsv(head, dataList, filePath1, true);
        System.out.println("writeDataListToCsvTime : " + (System.currentTimeMillis() - writeDataListToCsvTime) + " ms");

        // 一次性写入CSV文件
        String filePath = "D:\\myfile\\employee.csv";
        String dataStr = getCsvDataStr();
        long writeStringToCsvTime = System.currentTimeMillis();
        writeStringToCsv(head, dataStr, filePath, true);
        System.out.println("writeStringToCsvTime : " + (System.currentTimeMillis() - writeStringToCsvTime) + " ms");

        // 读取文件内容
        System.out.println("读取文件的内容:");
        System.out.println(readFromCsv(filePath1));
		
		// 内容追加
        writeDataListToCsv("开始内容追加", dataList, filePath1, true);

        writeStringToCsv("开始内容追加", dataStr, filePath, true);
    }

3. 测试结果如下:一次性写入CSV比一行行写入CSV的性能高。

Java大量数据写csv java写csv文件_List

4. 内容写入及追加结果

Java大量数据写csv java写csv文件_CSV_02