戴老师的博客 - csv
type: channel
link: https://www.tushu.info/tag/csv/
items: Java中csv文件读写分析

Java中csv文件读写分析
type: item
date: 2026-07-09T04:30:48+00:00
description: 一、txt、csv 与 tsv 文件txt、csv 和 tsv 均属于文本文件，它们的区别主要体现在分隔符的使用规范上。文件类型英文全称名称分隔符描述txttext文本类型无明确要求可以有分隔符，也可以没有csvComma-separated values逗号分隔值类型半角逗号：,csv 是 txt 的特殊类型tsvTab-separated values制表符分隔值制表符：\ttsv 是 txt 的特殊类型说明：CSV 也被称为 Char-separated values（字符分隔值类型），即通过字符值进行分隔。但由于半角逗号在数据内容中出现的概率较大，因此经常需要使用文本包装符（如双引号）来标识逗号为数据的一部分，或者直接使用其它特殊符号作为分隔符。二、csv 文件规范标准的 CSV 文件通常遵循以下规范：行记录：每一行记录位于一个单独的行上，通常用回车换行符 CRLF (\r\n.html) 分割。文件结尾：文件中的最后一行记录可以有结尾回车换行符，也可以没有。标题头：第一行可以存在一个可选的标题头，格式和普通记录行一致。标题头应包含文件记录字段对应的名称，且数量应与记录字段一致。字段分隔：在标题头行和普通行中，存在一个或多个由半角逗号 , 分隔的字段。整个文件中每行应包含相同数量的字段。空格也是字段的一部分，不应被忽略。每一行记录最后一个字段后不能跟逗号。（通常用逗号分隔，也有其他字符分隔的 CSV，需事先约定）。文本包装符：每个字段可用也可不用半角双引号 " 括起来（如 Microsoft Excel 默认不用双引号）。如果字段没有用引号括起来，那么该字段内部不能出现双引号字符。特殊字符处理：字段中若包含回车换行符、双引号或者逗号，该字段需要用双引号括起来。转义规则：如果用双引号括字段，那么出现在字段内的双引号前必须再加一个双引号进行转义。三、csv 使用场景CSV 文件经常用于导出大批量数据（相比 Excel 更轻量级，更适合大批量数据）。CSV 与 Excel 对比：内容支持：CSV 只能用于存储纯文本内容；Excel 不仅支持纯文本内容，还支持二进制数据。功能定位：CSV 可以看做是 Excel 的轻量级简单版实现，Excel 比 CSV 更加强大。兼容性与用途：CSV 文件可以被 Excel 软件直接打开，一般用于表格数据的传输。四、Java 中的 csv 类库Java 中处理 CSV 的类库主要有以下几类：javacsv：该项目在 2014-12-10 后已停止维护。opencsv：Apache 项目，至今仍在维护，功能较为丰富。commons-csv：Apache Commons 项目。hutool：国产工具集，包含 CsvUtil 工具类。1. javacsv注意：该库已停止维护多年，新项目不建议使用。2. opencsvOpenCSV 是一个用 Java 来分析和生成 CSV 文件的框架。通常用来将 Bean 写入 CSV 文件和从 CSV 文件读出 Bean，并支持注解的方式。Maven 依赖： com.opencsv opencsv 5.7.0 写入器名称描述CSVWriter简单的 CSV 写入器CSVParserWriter通过 CSVParser 解析数据的写入器StatefulBeanToCsv直接将 Bean 写入 CSV 的写入器读取器名称描述CSVReader简单的 CSV 读取器CsvToBeanCSV 读取为 Bean 的读取器CSVReaderHeaderAware感知文件头的 CSV 读取器解析器名称描述CSVParser简单的 CSV 解析器RFC4180Parser基于 RFC4180 规范的解析器注解注解描述主要属性@CsvBindByName按表头名称绑定required：必须字段，默认为 false，该字段为空抛异常column：对象列标题名称@CsvBindByPosition按位置绑定required：必须字段，默认为 false，该字段为空抛异常position：位置索引@CsvCustomBindByName与 CsvBindByName 相同，但必须提供自己的数据转换类required：必须字段，默认为 falsecolumn：对象列标题名称converter：转换器@CsvCustomBindByPosition与 CsvBindByPosition 相同，但必须提供自己的数据转换类required：必须字段，默认为 falsecolumn：对象列标题名称converter：转换器@CsvBindAndJoinByName应用于 MultiValuedMap 集合类型的 Bean 字段，通过标题名称绑定required：必须字段，默认为 falsecol…