reader
public class MutiFileReader extends MultiResourceItemReader<User> {
private String name = this.getClass().getName();
public MutiFileReader(){
try {
init();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private void init() throws FileNotFoundException {
/*存放文件的地址*/
File file = new File("E:\\code\\temp");
File[] files= file.listFiles();
Resource[] resources = new Resource[files.length];
for(int i=0;i<files.length;i++){
int finalI = i;
/*这里如果使用InputStreamResource 需要重写getFilename 因为InputStreamResource 没有实现 默认返回的是null*/
/*如果不重写这个方法 自己实现setComparator 也行*/
InputStreamResource inputStreamResource = new InputStreamResource(new FileInputStream(files[finalI])){
@Override
public String getFilename() {
return files[finalI].getName();
}
};
resources[i] = inputStreamResource;
}
// setComparator(new Comparator<Resource>() {
// @Override
// public int compare(Resource o1, Resource o2) {
// return 0;
// }
// });
setName(name);
setResources(resources);
FlatFileItemReader reader = new FlatFileItemReader<User>();
/*SimpleRecordSeparatorPolicy 每一行作为一条记录*/
reader.setRecordSeparatorPolicy(new SimpleRecordSeparatorPolicy());/*定义分割单条数据的策略*/
/*定义每一条记录 转换java实体类*/
DefaultLineMapper lineMapper = new DefaultLineMapper();
/*每一条记录转换为 fileSet对象 也可以理解为key-value 对象 */
/*delimiter 参数定义分隔符*/
DelimitedLineTokenizer delimitedLineTokenizer =new DelimitedLineTokenizer(",");
delimitedLineTokenizer.setNames("userName","passWord","phone","time");
lineMapper.setLineTokenizer(delimitedLineTokenizer);
/*设置fileSet 转换为java 实体*/
BeanWrapperFieldSetMapper beanWrapperFieldSetMapper = new BeanWrapperFieldSetMapper<User>();
beanWrapperFieldSetMapper.setTargetType(User.class);
lineMapper.setFieldSetMapper(beanWrapperFieldSetMapper);
reader.setLineMapper(lineMapper);/*转换读取内容为java 实体*/
reader.setLinesToSkip(2);/*设置忽略文件的前几行*/
// setStrict();/*检测文件是否存在 如果文件不存在 job失败*/
String[] comments = new String[]{"##"};
reader.setComments(comments); /*定义文件的注释行 也就是 读取时 会忽略的内容*/
/*这里只能设置一种代理 只能有一种处理方式吗*/
setDelegate(reader);
}
}
writer
public class CusFlatItemFileWriter extends FlatFileItemWriter<User> {
private String funcName = this.getClass().getSimpleName();
private String filePath;
private FileSystemResource fileSystemResource;
public CusFlatItemFileWriter(String filePath){
this.filePath = filePath;
init();
fileSystemResource = new FileSystemResource("E:\\code\\user.txt");
setResource(fileSystemResource);
}
private void init(){
setName(funcName);
setAppendAllowed(true);
/*设置 处理java对象的存储方式*/
DelimitedLineAggregator lineAggregator = new DelimitedLineAggregator();
lineAggregator.setDelimiter(",");
BeanWrapperFieldExtractor beanWrapperFieldExtractor = new BeanWrapperFieldExtractor();
/*保存的时候 要显示的对应的实体的字段*/
String[] names = new String[]{"userName","phone","time","passWord"};
beanWrapperFieldExtractor.setNames(names);
/*这个没什么意思 就是null 校验*/
beanWrapperFieldExtractor.afterPropertiesSet();
lineAggregator.setFieldExtractor(beanWrapperFieldExtractor);
setSaveState(false);
setLineAggregator(lineAggregator);
/*设置 是否 追加 还是 覆盖*/
setAppendAllowed(false);
}
}
运行
@SpringBootTest
public class MultiFileTest {
@Autowired
private JobLauncher jobLauncher;
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
private Step createStep(){
String name = User.class.getName();
Step step =stepBuilderFactory.get(name)
.<User,User>chunk(1)
.reader(new MutiFileReader())
.writer(new CusFlatItemFileWriter("user_writer.txt"))
.build();
return step;
}
private Job createJob(){
String name = User.class.getName();
return jobBuilderFactory.get(name).flow(createStep())
.end().build();
}
@Test
public void runJob() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
//构建参数
JobParameters jobParameters = new JobParametersBuilder()
.toJobParameters();
jobLauncher.run(createJob(),jobParameters);
}
}
