我的印象是这个工具完全读取一个文件,结果行对象保存在内存中
不会。内存的使用取决于您选择与CSVParser
对象交互的方式。
JavadocCSVParser
明确地解决了这个问题,在其Parsing record wise与Parsing into memory部分中,请注意:
根据输入,解析到内存可能会消耗大量系统资源。例如,如果您正在解析 150MB 的 CSV 数据文件,则内容将完全读入内存。
我快速浏览了源代码,实际上解析记录似乎是一次从其输入源读取一个块,而不是一次全部读取。不过自己看吧。
明智地解析记录
在Parsing record wise一节中,它展示了如何CSVRecord
通过循环Iterable
that is来一次递增地读取一个CSVParser
。
CSVParser parser = CSVParser.parse(csvData, CSVFormat.RFC4180);
for (CSVRecord csvRecord : parser) {
...
}
解析到内存
相比之下,解析到内存部分显示了使用CSVParser::getRecords
将所有CSVRecord
对象一次List
全部加载到内存中。所以很明显,一个非常大的输入文件可能会耗尽一台受限机器上的内存。
Reader in = new StringReader("a;b\nc;d");
CSVParser parser = new CSVParser(in, CSVFormat.EXCEL);
List<CSVRecord> list = parser.getRecords();