如何使用FlatFileItemReader将10行数据作为一条记录读取?
实现10行合并为一条记录的FlatFileItemReader
要实现将10行数据合并为一条记录读取,核心是通过自定义RecordSeparatorPolicy改变FlatFileItemReader的记录拆分规则——默认按单行拆分,我们可以自定义策略攒够10行再返回一个完整记录。
步骤1:自定义RecordSeparatorPolicy
这个类负责判断何时构成一条完整记录,并将多行拼接成一个字符串返回:
public class TenLineRecordSeparatorPolicy implements RecordSeparatorPolicy { private int lineCounter = 0; private StringBuilder recordBuffer = new StringBuilder(); @Override public boolean isEndOfRecord(String line) { lineCounter++; recordBuffer.append(line).append(System.lineSeparator()); // 每累积10行,标记为一条完整记录 return lineCounter % 10 == 0; } @Override public String postProcess(String record) { // 返回拼接好的10行内容,去除末尾多余换行 String fullRecord = recordBuffer.toString().trim(); // 重置缓冲区和计数器,准备下一条记录 recordBuffer.setLength(0); return fullRecord; } @Override public String preProcess(String line) { return line; } }
步骤2:修改FlatFileItemReader配置
在reader中设置自定义的分隔策略,替换默认的单行拆分逻辑:
public FlatFileItemReader<List<SMSData>> flatFileItemReader() { FlatFileItemReader<List<SMSData>> flatFileItemReader = new FlatFileItemReader<>(); flatFileItemReader.setResource(new FileSystemResource(new File("C:\\Users\\mdtouhid.it\\Downloads\\Flat-File-Item-Reader-In-Action\\InputFiles\\finalsms4appr1.csv"))); flatFileItemReader.setLineMapper(lineMapper()); flatFileItemReader.setLinesToSkip(1); // 跳过表头行 // 应用自定义的10行合并策略 flatFileItemReader.setRecordSeparatorPolicy(new TenLineRecordSeparatorPolicy()); // 注意:原代码的setMaxItemCount(10)是限制读取10条记录(即100行),如果需要读取全部记录请移除该设置 // flatFileItemReader.setMaxItemCount(10); System.out.println("Inside Item flat file reader" + flatFileItemReader); return flatFileItemReader; }
步骤3:调整LineMapper处理合并后的多行内容
现在mapLine方法的combinedLines参数会收到10行拼接的字符串,拆分后转换为SMSData列表即可:
@Bean LineMapper<List<SMSData>> lineMapper() { return new LineMapper<List<SMSData>>() { @Override public List<SMSData> mapLine(String combinedLines, int lineNumber) throws Exception { System.out.println("Inside line print: " + combinedLines); List<SMSData> dataList = new ArrayList<>(); // 拆分拼接的字符串为单行 String[] lines = combinedLines.split(System.lineSeparator()); for (String line : lines) { dataList.add(SMSData.of(line)); } return dataList; } }; }
补充说明
- 如果文件末尾不足10行,自定义策略会自动将剩余行作为最后一条记录返回。
- 若需要灵活配置合并行数,可以将10作为参数传入自定义的TenLineRecordSeparatorPolicy,避免硬编码。
内容的提问来源于stack exchange,提问作者touhid islam
相关产品推荐
相关产品推荐

