FastCSV 读取 CSV 的 3 种记录类型:CsvRecord、NamedCsvRecord 与 StringArray,一篇搞懂怎么选
【免费下载链接】FastCSVFast, lightweight, and RFC 4180 compliant CSV library for Java. Zero dependencies, ~90 KiB. Trusted by Apache NiFi, JUnit, and Neo4j.项目地址: https://gitcode.com/gh_mirrors/fa/FastCSV
处理 CSV 数据是 Java 开发中最常见的需求之一,而FastCSV 读取 CSV时提供的 3 种记录类型——CsvRecord、NamedCsvRecord与StringArray——让新手经常犯难:到底该用哪一个?本文用最简单的方式,帮你一次搞懂 3 种记录类型的区别、适用场景与选择技巧,读完就能直接上手。
FastCSV 是一个零依赖、约 90 KiB、完全兼容 RFC 4180 的轻量级 Java CSV 库,被 Apache NiFi、JUnit、Neo4j 等知名项目广泛使用。它的读取 API 设计得非常优雅:同一个CsvReader构建器,通过不同的入口方法,就能产出不同形态的记录对象。下面逐一介绍。
1. CsvRecord:最通用的按索引读取方式
CsvRecord是 FastCSV 最基础的记录类型,适合表头不重要、或你知道每一列顺序的场景。它的特点是不可变、线程安全,字段值永远不会是null(空字段用空字符串表示)。
一行代码读取 CsvRecord
try (CsvReader<CsvRecord> csv = CsvReader.builder().ofCsvRecord(data)) { for (CsvRecord record : csv) { System.out.println(record.getField(0)); // 按索引取字段 } }CsvRecord 的常用方法一览
| 方法 | 作用 |
|---|---|
getField(int index) | 按索引取字段值,从 0 开始 |
getFields() | 获取全部字段(不可变 List) |
getFieldCount() | 获取字段数量 |
getStartingLineNumber() | 获取记录起始行号,处理多行字段时很有用 |
isComment() | 判断是否为注释行 |
CsvRecord的完整 API 定义可参考源码:CsvRecord.java。
2. NamedCsvRecord:按表头名称读取,代码可读性最佳
如果你的 CSV 文件带有表头(第一行是列名),那么NamedCsvRecord是首选。它继承自CsvRecord,额外增加了按名称取值的强大能力,代码写出来几乎和读自然语言一样清晰。
按名称取值有多方便?
try (CsvReader<NamedCsvRecord> csv = CsvReader.builder().ofNamedCsvRecord(data)) { csv.forEach(rec -> System.out.println(rec.getField("firstName"))); }当表头顺序变化时,你的业务代码完全不用改,这正是 NamedCsvRecord 的核心价值。
NamedCsvRecord 的进阶方法
getField(String name):按名称取值,不存在时抛出异常findField(String name):返回Optional<String>,安全取值getFieldsAsMap():将整行转换为Map<String, String>getHeader():获取表头名称列表
⚠️ 小提示:表头名称是区分大小写的,且允许重复。如果出现重复表头,getFieldsAsMap()只保留第一个值,需要全部值时用getFieldsAsMapList()。实现细节见 NamedCsvRecord.java。
3. StringArray:极致性能的原始数组读取
前两种类型都是不可变对象,封装和访问会带来少量内存开销。当你在高性能、大量对象分配成为瓶颈的场景(如大数据批处理、基准测试)下,FastCSV 提供了第三种选择——StringArrayHandler,直接以String[]数组返回每一行,零封装开销。
StringArray 的读取写法
final var handler = StringArrayHandler.builder().build(); try (CsvReader<String[]> csv = CsvReader.builder().build(handler, data)) { for (String[] fields : csv) { System.out.println(fields[0] + ", " + fields[1]); } }官方文档明确提醒:只在确定需要时才使用它。日常业务开发优先用前两种,避免过早优化。完整的示例代码见 ExampleCsvReaderWithStringArrayAccess.java。
3 种记录类型对比速查表
| 对比维度 | CsvRecord | NamedCsvRecord | StringArray |
|---|---|---|---|
| 入口方法 | ofCsvRecord() | ofNamedCsvRecord() | build(handler, ...) |
| 取值方式 | 按索引 | 按名称 | 按索引 |
| 不可变/线程安全 | ✅ | ✅ | ❌(直接暴露数组) |
| 对象分配开销 | 中等 | 中等 | 最低 |
| 适合场景 | 通用读取 | 有表头的业务数据 | 极致性能场景 |
怎么选?记住这 3 条黄金法则
- 有表头、要可读性→ 用
NamedCsvRecord,表头变动也不怕; - 无表头、按列处理→ 用
CsvRecord,简单直接够用; - 性能敏感、追求极致→ 用
StringArray,但请先确认真的需要。
进阶:从记录映射到业务对象
实际项目中,我们通常会把读取到的记录映射成业务对象。配合 Java 的record特性,整个过程非常优雅:
Person mapPerson(final NamedCsvRecord rec) { return new Person( Long.parseLong(rec.getField("ID")), rec.getField("firstName"), rec.getField("lastName") ); }完整示例见 ExampleCsvReaderMapping.java,更多读取技巧(BOM 处理、注释行、字段修饰等)可以参考文档目录 docs/src/content/docs/guides/。
总结
FastCSV 读取 CSV 的 3 种记录类型各有定位:CsvRecord通用稳妥、NamedCsvRecord清晰易读、StringArray极致高效。绝大多数场景下,NamedCsvRecord是你最好的默认选择。现在就打开项目,用 FastCSV 感受一下零依赖、极速解析的 CSV 读取体验吧!🚀
【免费下载链接】FastCSVFast, lightweight, and RFC 4180 compliant CSV library for Java. Zero dependencies, ~90 KiB. Trusted by Apache NiFi, JUnit, and Neo4j.项目地址: https://gitcode.com/gh_mirrors/fa/FastCSV
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考