Java实现CSV文件的读写(包含追加内容)

您所在的位置:网站首页 java怎么打印对象内容文件 Java实现CSV文件的读写(包含追加内容)

Java实现CSV文件的读写(包含追加内容)

2024-07-09 17:06| 来源: 网络整理| 查看: 265

目录 一、简介二、maven依赖或jar三、CSV工具类四、CSV读写测试4.1、文件写入4.2、文件内容追加4.3、文件读取 结语

一、简介

  逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据,CSV文件的特点:

文件由任意数目的记录组成每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符记录间以某种换行符分隔(windows和linux下不一样)所有记录都有完全相同的字段序列通常都是纯文本文件(一般是建议使用文本编辑工具打开) 二、maven依赖或jar org.apache.commons commons-lang3 3.12.0 junit junit 4.12 compile

  如果你没有使用maven工程,你也可去去下载相关jar包比如: commons-lang3-3.12.0.jar,效果是一样的, junit 只是用于单元测试.

三、CSV工具类

CsvUtil.java

package com.alian.csdn.utils; import org.apache.commons.lang3.StringUtils; import java.io.*; import java.util.ArrayList; import java.util.List; public class CsvUtil { /** * CSV文件生成方法 字符流追加:FileWriter writer = new FileWriter(file,true) * * @param headLabel 头部标签 * @param dataList 数据列表 * @param filePath 文件路径 * @param addFlag 是否追加 */ public static void writeToCsv(String headLabel, List dataList, String filePath, boolean addFlag) { BufferedWriter buffWriter = null; try { //根据指定路径构建文件对象 File csvFile = new File(filePath); //文件输出流对象,第二个参数时boolean类型,为true表示文件追加(在已有的文件中追加内容) FileWriter writer = new FileWriter(csvFile, addFlag); //构建缓存字符输出流(不推荐使用OutputStreamWriter) buffWriter = new BufferedWriter(writer, 1024); //头部不为空则写入头部,并且换行 if (StringUtils.isNotBlank(headLabel)) { buffWriter.write(headLabel); buffWriter.newLine(); } //遍历list for (String rowStr : dataList) { //如果数据不为空,则写入文件内容,并且换行 if (StringUtils.isNotBlank(rowStr)) { buffWriter.write(rowStr); buffWriter.newLine();//文件写完最后一个换行不用处理 } } //刷新流,也就是把缓存中剩余的内容输出到文件 buffWriter.flush(); } catch (Exception e) { System.out.println("写入csv出现异常"); e.printStackTrace(); } finally { try { //关闭流 if (buffWriter != null) { buffWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 根据文件路径读取csv文件的内容 * * @param filePath * @return */ public static List readFromCsv(String filePath) { ArrayList dataList = new ArrayList(); BufferedReader buffReader = null; try { //构建文件对象 File csvFile = new File(filePath); //判断文件是否存在 if (!csvFile.exists()) { System.out.println("文件不存在"); return dataList; } //构建字符输入流 FileReader fileReader = new FileReader(csvFile); //构建缓存字符输入流 buffReader = new BufferedReader(fileReader); String line = ""; //根据合适的换行符来读取一行数据,赋值给line while ((line = buffReader.readLine()) != null) { if (StringUtils.isNotBlank(line)) { //数据不为空则加入列表 dataList.add(line); } } } catch (Exception e) { System.out.println("读取csv文件发生异常"); e.printStackTrace(); } finally { try { //关闭流 if (buffReader != null) { buffReader.close(); } } catch (IOException e) { e.printStackTrace(); } } return dataList; } }

  这里需要注意的是文件输出流对象,第二个参数时boolean类型,为true表示文件追加(在已有的文件中追加内容)

FileWriter writer = new FileWriter(csvFile, addFlag);

  关于BufferedWriter使用几点说明:

使用到的是缓存字符输出流,默认大小是8192,我这里使用的是1024没有进行流的关闭操作,数据会存在缓冲区中,不会存储到文件上,只有当数据超过了缓冲区的大小(比如这里的1024),或者手动调用flush方法,数据才会刷新到文件上调用close方法的内部会先调用flush刷新缓冲区

关于流的更多内容可以参考:Java中常见IO流的介绍与使用

四、CSV读写测试 4.1、文件写入 @Test public void writeToCsv() { String headDataStr = "交易流水,商户编号,订单金额,支付金额,优惠金额,收款账户,支付方式,支付状态,支付时间,交易类型"; String csvfile = "C:\\myFile\\CSV\\对账文件20211111.csv"; List dataList = new ArrayList(); dataList.add("190469644375,100011,4000,4000,0,105000041112608,03,00,2021-09-12 07:44:12,8"); dataList.add("190469644954,100011,4000,4000,0,105000041112608,03,00,2021-09-12 07:50:10,8"); dataList.add("190469645620,100011,4000,4000,0,105000041112608,03,00,2021-09-12 07:56:59,8"); dataList.add("190469661593,100011,2000,2000,0,105000041112608,01,00,2021-09-12 09:51:24,8"); dataList.add("190469661738,100011,2000,2000,0,105000041112608,01,00,2021-09-12 09:52:15,8"); dataList.add("190469661853,100011,2000,2000,0,105000041112608,01,00,2021-09-12 09:52:51,8"); dataList.add("190469661931,100011,2000,2000,0,105000041112608,01,00,2021-09-12 09:53:27,8"); dataList.add("190469699471,100011,2000,2000,0,105000041112608,03,00,2021-09-12 13:59:02,8"); dataList.add("190469699540,100011,2000,2000,0,105000041112608,03,00,2021-09-12 13:59:29,8"); dataList.add("190469712840,100011,4000,4000,0,105000041112608,03,00,2021-09-12 15:20:32,8"); CsvUtil.writeToCsv(headDataStr, dataList, csvfile, false); }

运行结果: 我这里使用notepad++工具打开,查看到内容如下: 在这里插入图片描述

4.2、文件内容追加 @Test public void appendToCsv() { String csvfile = "C:\\myFile\\CSV\\对账文件20211111.csv"; List dataList = new ArrayList(); dataList.add("190469730006,100011,4000,4000,0,105000041112608,01,00,2021-09-12 16:52:57,8"); dataList.add("190469730173,100011,4000,4000,0,105000041112608,01,00,2021-09-12 16:53:54,8"); dataList.add("190469730367,100011,4000,4000,0,105000041112608,01,00,2021-09-12 16:54:50,8"); dataList.add("190469736543,100011,4000,4000,0,105000041112608,01,00,2021-09-12 17:25:53,8"); dataList.add("190469746558,100011,4000,4000,0,105000041112608,01,00,2021-09-12 18:14:13,8"); CsvUtil.writeToCsv("", dataList, csvfile, true); }

运行结果: 我这里使用notepad++工具打开,查看到在原有内容的基础上增加了内容 在这里插入图片描述

4.3、文件读取 @Test public void readFromCsv() { String csvFilePath = "C:\\myFile\\CSV\\对账文件20211111.csv"; List list = CsvUtil.readFromCsv(csvFilePath); for (String data : list) { System.out.println(data); } }

运行结果:

交易流水,商户编号,订单金额,支付金额,优惠金额,收款账户,支付方式,支付状态,支付时间,交易类型 190469644375,100011,4000,4000,0,105000041112608,03,00,2021-09-12 07:44:12,8 190469644954,100011,4000,4000,0,105000041112608,03,00,2021-09-12 07:50:10,8 190469645620,100011,4000,4000,0,105000041112608,03,00,2021-09-12 07:56:59,8 190469661593,100011,2000,2000,0,105000041112608,01,00,2021-09-12 09:51:24,8 190469661738,100011,2000,2000,0,105000041112608,01,00,2021-09-12 09:52:15,8 190469661853,100011,2000,2000,0,105000041112608,01,00,2021-09-12 09:52:51,8 190469661931,100011,2000,2000,0,105000041112608,01,00,2021-09-12 09:53:27,8 190469699471,100011,2000,2000,0,105000041112608,03,00,2021-09-12 13:59:02,8 190469699540,100011,2000,2000,0,105000041112608,03,00,2021-09-12 13:59:29,8 190469712840,100011,4000,4000,0,105000041112608,03,00,2021-09-12 15:20:32,8 190469730006,100011,4000,4000,0,105000041112608,01,00,2021-09-12 16:52:57,8 190469730173,100011,4000,4000,0,105000041112608,01,00,2021-09-12 16:53:54,8 190469730367,100011,4000,4000,0,105000041112608,01,00,2021-09-12 16:54:50,8 190469736543,100011,4000,4000,0,105000041112608,01,00,2021-09-12 17:25:53,8 190469746558,100011,4000,4000,0,105000041112608,01,00,2021-09-12 18:14:13,8 结语

  其实这个工具不仅仅是用于CSV文件的操作,其他的字符流的文件都是可以进行读写的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3