哪个API用于读取文件列表以便可以对其进行描述?

时间:2014-01-24 11:32:49

标签: file row spring-batch jobs

我想使用Spring Batch读取文件列表,并将它们作为文件中每行的项目进行处理。在文件的末尾,我想要计算文件中的行数。

我在Spring Batch中使用哪个API来知道某个项目代表文件的结尾,在下一个文件开始之前?

1 个答案:

答案 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批量基于委托,因此,使用MultiResourceItemReaderSingleItemPeekableItemReader的属性“委托”,我们可以轻松解决问题。 这是一个简单的骨架(只是一个想法,我不能测试它抱歉):

<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>