如何在Item阅读器中获取spring批处理文件中的行数

时间:2014-01-22 18:30:26

标签: java spring spring-batch

我是Spring的新手。我有一个Job,它读取文件并写入数据库。如果文件中的记录数超过8000,我不应该处理该文件,并且应该停止作业执行。请建议更好的方法是什么。

3 个答案:

答案 0 :(得分:2)

您可以在itemreader上实现StepExecutionListener。然后你可以获得与你的行号相对应的readcount。

 public class ExampleItemReader implements ItemReader<String>, StepExecutionListener {

    public synchronized String read() throws Exception {
        return "";
    }

    @Override
    public ExitStatus afterStep(StepExecution executionContext) {
        if (executionContext.getReadCount() > 8000) {
            return ExitStatus.COMPLETED;
        }
        return ExitStatus.EXECUTING;
    }

    @Override
    public void beforeStep(StepExecution arg0) {

    }

}

建议阅读spring batch patterns

答案 1 :(得分:1)

不是特定于春天的东西,但LineNumberReader中有一个班级java.io。您可以使用它及其skip方法来跳过大量的字符。

示例:

public int getNoOfLines(String fileName) {
   LineNumberReader reader = new LineNumberReader(new FileReader(fileName));
   reader.skip(Integer.MAX_VALUE); //skips those many chars, if you feel your file size may exceed you can use Long.MAX_VALUE
   return reader.getLineNumber();
}

这比读取文件和计数更有效。

答案 2 :(得分:0)

我假设您文件中的记录不是固定长度。如果是这样,File.length()将很容易计算文件中的记录数。

如果没有,它需要精确到8000还是大约8000?如果这是一个粗略的限制,我将得到这些文件的平均记录长度,然后使用File.length()来估计记录的数量。