FastCSV 读取 CSV 的 3 种记录类型:CsvRecord、NamedCsvRecord 与 StringArray,一篇搞懂怎么选

FastCSV 读取 CSV 的 3 种记录类型:CsvRecord、NamedCsvRecord 与 StringArray,一篇搞懂怎么选

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 种记录类型——CsvRecordNamedCsvRecordStringArray——让新手经常犯难:到底该用哪一个?本文用最简单的方式,帮你一次搞懂 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 种记录类型对比速查表

对比维度CsvRecordNamedCsvRecordStringArray
入口方法ofCsvRecord()ofNamedCsvRecord()build(handler, ...)
取值方式按索引按名称按索引
不可变/线程安全❌(直接暴露数组)
对象分配开销中等中等最低
适合场景通用读取有表头的业务数据极致性能场景

怎么选?记住这 3 条黄金法则

  1. 有表头、要可读性→ 用NamedCsvRecord,表头变动也不怕;
  2. 无表头、按列处理→ 用CsvRecord,简单直接够用;
  3. 性能敏感、追求极致→ 用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),仅供参考