java - Java InputStream(或 CsvMapper)中的总行数

标签 java algorithm csv inputstream

如何在不循环计算行数的情况下从 InputStream 或 CsvMapper 获取行数?

下面我有一个从 CSV 文件创建的 InputStream。

InputStream content = (... from a resource ...);
CsvMapper mapper = new CsvMapper();
mapper.enable(CsvParser.Feature.WRAP_AS_ARRAY);
MappingIterator<Object[]> it = mapper
        .reader(Object[].class)
        .readValues(content);

是否可以做类似的事情

int totalRows = mapper.getTotalRows();

我想在循环中使用这个数字来更新进度。

while (it.hasNextValue()){
    //do stuff here

    updateProgressHere(currentRow, totalRows);
}

显然,我可以遍历并计算一次。然后再次循环处理,同时更新进度。这是低效且缓慢的,因为其中一些 InputStreams 很大。

最佳答案

除非您提前知道行数,否则不循环是不可能的。您必须完整地读取该文件才能知道其中有多少行,InputStreamCsvMapper 都没有提前读取的方法并为您抽象(它们都是面向流的接口(interface))。

ObjectReader 可以操作的接口(interface)都不支持查询底层文件大小(如果它是一个文件)或到目前为止读取的字节数。

一个可能的选择是创建您自己的自定义 InputStream,它还提供获取总大小和到目前为止读取的字节数的方法,例如如果它正在从文件中读取,它可以公开底层 File.length() 并跟踪读取的字节数。这可能不完全准确,特别是如果 jackson 在前面缓冲得很远,但它至少可以让你得到一些东西。

关于java - Java InputStream(或 CsvMapper)中的总行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22254158/

相关文章:

java - 带 jetty 的 Spring Websocket 破坏了 mvc 测试

java - 如何以编程方式配置 Jetty 以执行 JSP 页面?

排除数字的算法

java - 如何通过循环小时来返回时间对象列表

java - 如何在字节 Java 中发送大于 127 的值

java - 删除 JSF dataTable 中数据库的行

algorithm - 确定网格上的一个点是否被某种类型的点包围

java - 为什么每次继续 while 循环时我的变量都会被重置?

python - 如何拆分 CSV 行,以便行 [0] 是名称,任何剩余的项目都是元组?

C读取csv文件