【发布时间】:2014-03-07 15:28:49
【问题描述】:
如何从 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);
}
显然,我可以循环并数一次。然后再次循环并在更新进度的同时处理它们。这是低效且缓慢的,因为其中一些 InputStream 非常庞大。
【问题讨论】:
-
他们需要以某种方式被计算在内。除非在 csv 文件的某处指定行数,否则无法绕过它进行迭代。您最好的选择可能是获取文件的大小,然后对处理的每一行的大小保持运行记录。你可以用它来获得这样的完成百分比。
-
手术一般需要多长时间?如果它在 20-30 秒左右,您通常可以摆脱那些模糊的来回进度条之一,而不会损害 UX(甚至是一个完全假的,它会倒计时固定的上限数量时间,如果提早结束,用户会感到惊喜——俗气,但可能会实现让用户对程序运行感到满意的目标。
-
长于 :( 文件中的每一行最终都是一个单独的请求。
-
@tiger13cubed 文件的来源是什么?它只是一个通用文件上传,还是来自例如自定义客户端应用程序或 AJAX 请求?如果客户端能够提前读取文件大小(或只是快速计算文件中的行数),它可以将行数/大小作为 URL 参数包含在内,您可以传递该参数。
标签: java algorithm csv inputstream