目录
一、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的性能高。
4. 内容写入及追加结果