如何使用spring-batch和MultiResourceItemReader读取文件夹中的所有文件?
我想配置spring-batch
以按顺序读取特定文件夹中的所有csv
文件。
以下方法不起作用,因为委托将尝试打开名为*.csv
的文件,这当然是无效的。 我需要在这里更改什么?
@Bean public ItemReader reader() { MultiResourceItemReader reader = new MultiResourceItemReader(); reader.setResources(new Resource[] {new FileSystemResource("/myfolder/*.csv")}); reader.setDelegate(new FlatFileItemReader(..)); return reader; }
等效的xml配置将编写如下,我怎么能将它重写为仅java配置?
我认为你应该使用PathMatchingResourcePatternResolver
。
像这样使用PathMatchingResourcePatternResolver。
@Bean public ItemReader reader() { Resource[] resources = null; ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver(); try { resources = patternResolver.getResources("/myfolder/*.csv"); } catch (IOException e) { e.printStackTrace(); } MultiResourceItemReader reader = new MultiResourceItemReader<>(); reader.setResources(resources); reader.setDelegate(new FlatFileItemReader<>(..)); return reader;
}
从绝对文件路径读取多个文件:
@Bean public MultiResourceItemReader multiResourceItemReader() { MultiResourceItemReader resourceItemReader = new MultiResourceItemReader (); ClassLoader cl = this.getClass().getClassLoader(); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl); Resource[] resources = resolver.getResources("file:" + filePath ); resourceItemReader.setResources(resources); resourceItemReader.setDelegate(reader()); return resourceItemReader; } @Bean public FlatFileItemReader reader() { FlatFileItemReader reader = new FlatFileItemReader (); reader.setLineMapper(new DefaultLineMapper() {{ setLineTokenizer(new DelimitedLineTokenizer() {{ setNames(new String[]{"id1", "POJO"}); }}); setFieldSetMapper(new BeanWrapperFieldSetMapper () {{ setTargetType(POJO.class); }}); }}); return reader; }
或者@Value注释可用于让ResourceArrayPropertyEditor将字符串转换为Resource []。
@Bean @StepScope public ItemReader reader( @Value("file:/myfolder/*.csv") Resource[] resources ) { MultiResourceItemReader reader = new MultiResourceItemReader<>(); reader.setResources(resources); reader.setDelegate(new FlatFileItemReader<>(..)); return reader; }