Springbatch provides MultiResourceItemReader to allow us to read all files in a folder:
<bean id="filenameReader" class=" org.springframework.batch.item.file.MultiResourceItemReader"> <property name="resources" value="file:SpringBatchReadFilename/tmp/*.csv" /> <property name="delegate" ref="filenameFlatReader" /> </bean>
However, there maybe some cases that we want. Assume we have below 2 files and we want to output the filename in processor or writer.
20160402.csv
id,value
4,d
20160403.csv
id,value
1,a
2,b
3,c
How do we do that? My friend Yidong Du provides an brilliant solution: write a self-defined FlatFileItemReader and overwrite setResource(), doReader() methods. In each doReader set the filename in entity:
@Data public class FilenameItemReader extends FlatFileItemReader<FilenameEntity> { private Resource myresource; @Override public void setResource(Resource var1) { super.setResource(var1); myresource = var1; } @Override protected FilenameEntity doRead() throws Exception { FilenameEntity filenameEntity = super.doRead(); if (filenameEntity == null) { return null; } filenameEntity.setFileName(myresource.getFile().getName()); return filenameEntity; } }
In writer, it writes the entities with fileName:
FilenameEntity(id=4, value=d, fileName=20160402.csv)
FilenameEntity(id=1, value=a, fileName=20160403.csv)
FilenameEntity(id=2, value=b, fileName=20160403.csv)
FilenameEntity(id=3, value=c, fileName=20160403.csv)
Check my code on github: link