Reader
public class CusPatternMatchReader extends FlatFileItemReader {
private String name = this.getClass().getName();
private String resPath;
public CusPatternMatchReader(String resPath){
this.resPath = resPath;
init();
}
private void init(){
setName(name);
setResource(new ClassPathResource(resPath));
PatternMatchingCompositeLineMapper patternMatchingCompositeLineMapper = new PatternMatchingCompositeLineMapper<>();
Map tokenizers = new HashMap<>();
/*定义每一条记录 转换java实体类*/
DelimitedLineTokenizer userToken =new DelimitedLineTokenizer(",");
DelimitedLineTokenizer peopeleToken =new DelimitedLineTokenizer(",");
userToken.setNames("userName","passWord","phone","time","address","tag");
peopeleToken.setNames("userName","passWord","phone","time","tag");
/*这里的key 可以理解为以什么开头*/
tokenizers.put("user*",userToken);
tokenizers.put("people*",peopeleToken);
patternMatchingCompositeLineMapper.setTokenizers(tokenizers);
Map> fieldSetMappers = new HashMap<>();
BeanWrapperFieldSetMapper userMapper = new BeanWrapperFieldSetMapper();
BeanWrapperFieldSetMapper peopleMapper = new BeanWrapperFieldSetMapper();
/*这个类型必须设置 或者设置name属性也行*/
userMapper.setTargetType(User.class);
peopleMapper.setTargetType(People.class);
/*这里的key 可以理解为以什么开头*/
fieldSetMappers.put("user*",userMapper);
fieldSetMappers.put("people*",peopleMapper);
patternMatchingCompositeLineMapper.setFieldSetMappers(fieldSetMappers);
setLineMapper(patternMatchingCompositeLineMapper);
}
}
writer
package com.example.demo.writer;
import com.example.demo.entity.Base;
import com.example.demo.entity.User;
import org.springframework.batch.item.file.FlatFileItemWriter;
import org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor;
import org.springframework.batch.item.file.transform.DelimitedLineAggregator;
import org.springframework.core.io.FileSystemResource;
import java.util.Iterator;
import java.util.List;
public class CusMutiMatchFileWriter extends FlatFileItemWriter {
private String funcName = this.getClass().getSimpleName();
private String filePath;
private FileSystemResource fileSystemResource;
public CusMutiMatchFileWriter(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(",");
setSaveState(false);
setLineAggregator(lineAggregator);
/*设置 是否 追加 还是 覆盖*/
setAppendAllowed(false);
}
@Override
public String doWrite(List items) {
StringBuilder lines = new StringBuilder();
Iterator var3 = items.iterator();
while(var3.hasNext()) {
Base item = (Base) var3.next();
((DelimitedLineAggregator)this.lineAggregator).setFieldExtractor(getFieldExtractorByTag(item.getTag()));
lines.append(this.lineAggregator.aggregate(item)).append(this.lineSeparator);
}
return lines.toString();
}
private BeanWrapperFieldExtractor getFieldExtractorByTag(String tag){
BeanWrapperFieldExtractor beanWrapperFieldExtractor = new BeanWrapperFieldExtractor();
String[] names;
if(tag.equals("1")){
/*保存的时候 要显示的对应的实体的字段*/
names = new String[]{"userName","phone","time","passWord","address","tag"};
}else{
names = new String[]{"userName","phone","time","passWord","tag"};
}
beanWrapperFieldExtractor.setNames(names);
/*这个没什么意思 就是null 校验*/
beanWrapperFieldExtractor.afterPropertiesSet();
return beanWrapperFieldExtractor;
}
}
运行
package com.example.demo;
import com.example.demo.entity.Base;
import com.example.demo.entity.User;
import com.example.demo.reader.CusPatternMatchReader;
import com.example.demo.reader.MultiLineReader;
import com.example.demo.writer.CusFlatItemFileWriter;
import com.example.demo.writer.CusMutiMatchFileWriter;
import org.junit.jupiter.api.Test;
import org.springframework.batch.core.*;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class MultiMatchTest {
@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)
. chunk(1)
.reader(new CusPatternMatchReader("user_match.txt"))
.writer(new CusMutiMatchFileWriter("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);
}
}
读取文本内容
user,BB,1234,123213,123213,1
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2
people,BB,1234,123213,2