2014-01-22 41 views

回答

0

我假設您的文件中的記錄不是固定的長度。如果是這樣,File.length()將輕鬆計算文件中的記錄數。

如果不是,它是否需要正好8000或8000左右?如果這是一個粗略的限制,我會得到這些文件的平均記錄長度,然後使用File.length()來估計記錄數。

1

不是特定於春天的東西,但java.io中有一個類LineNumberReader。你可以使用它和它的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(); 
} 

這不僅僅是讀取文件及數量高效。

+0

謝謝你的回答。我正在嘗試爲我的工作實施父級步驟,在那裏我將確定行數以及如何在父級步驟完成後停止工作。 – user3217014

+0

如果您可以在父步驟中獲得該文件,則可以調用上述方法並知道該文件中的行數 –

2

您可以在itemreader上實現StepExecutionListener。然後你可以得到與你的線路號碼相對應的讀數。

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

+0

這不完全是OP要的,因爲此解決方案處理該文件,並且OP想要放棄所有記錄計數> 8K!使用解決方案(無需更快計數記錄的技巧)可能更適合創建前一步驟,請檢查8K條件(只讀取記錄,無需寫入),並在使用[JobExecutionDecider'](httpd://docs.spring。 io/spring-batch/apidocs/org/springframework/batch/core/job/flow/JobExecutionDecider.html)來檢查工作是否需要繼續或完成(這應該會使工作流程更清潔) –

+0

嗯,你是對的。如果一個進程對於超過8K行的文件不是必需的,則前面的步驟會更好。 – nsylmz