我想使用Spring Batch读取文件列表,并将它们作为文件中每行的项目进行处理。在文件的末尾,我想要计算文件中的行数。
我在Spring Batch中使用哪个API来知道某个项目代表文件的结尾,在下一个文件开始之前?
答案 0 :(得分:0)
我想你正在处理基于记录的文件
使用MultiResourceItemReader
(读取多个文件)和FlatFileItemReader
(解析文件)
我们的目的是检测文件何时到达结尾,以便PeekableItemReader
我们预测下一条记录,如果是null
我们符合EOF
class EOFCheckItemReader<T> extends SingleItemPeekableItemReader<T> {
private int count;
T read() {
T item = super.read();
if(null == item) {
// EOF detected
manageEOF();
count = 0;
}
else {
count++;
}
return item;
}
private void manageEOF() {}
// Also implements update(), open(), close()
// to save count value into execution context
// No need to save delegate's state because we register it
// as stream into job's xml definition
}
Spring批量基于委托,因此,使用MultiResourceItemReader
或SingleItemPeekableItemReader
的属性“委托”,我们可以轻松解决问题。
这是一个简单的骨架(只是一个想法,我不能测试它抱歉):
<bean name="csvReader" class="FlatFileItemReader">
<!-- set all properties -->
</bean>
<bean name="eofCheckReader" class="EOFCheckItemReader">
<property name="delegate" ref="multiResourceReader" />
</bean>
<bean name="multiResourceReader">
<property name="resources" value="file://*.csv" />
<property name="delegate" ref="csvReader" />
</bean>
<step>
<chunk reader="eofCheckReader" />
<streams>
<stream ref="multiResourceReader" />
</streams>
</step>