Spring batch 读取统一文件中不同的数据

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

你可能感兴趣的:(Spring batch 读取统一文件中不同的数据)