数据写入——写入到txt、csv等平面文件

spring batch读取完数据,然后执行process,执行完毕开始写入文件,本章以写入txt、csv等平面文件为例。
Spring batch提供了FlatFileItemWriter类来实现写入文件时的配置。
示例:读取下面User.xml文件,然后把xml中数据写入UserWrite.txt文件中。

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <user>
        <id>1</id>
        <name>lzj</name>
        <age>28</age>
    </user>
    <user>
        <id>2</id>
        <name>Tom</name>
        <age>20</age>
    </user>
    <user>
        <id>3</id>
        <name>Jerry</name>
        <age>18</age>
    </user>
    <user>
        <id>4</id>
        <name>Jerry</name>
        <age>18</age>
    </user>
    <user>
        <id>5</id>
        <name>Bob</name>
        <age>25</age>
    </user>
    <user>
        <id>5</id>
        <name>Ferry</name>
        <age>30</age>
    </user>
    <user>
        <id>6</id>
        <name>Marry</name>
        <age>39</age>
    </user>
    <user>
        <id>7</id>
        <name>Linda</name>
        <age>20</age>
    </user>
    <user>
        <id>8</id>
        <name>Linda</name>
        <age>23</age>
    </user>
    <user>
        <id>9</id>
        <name>Jiken</name>
        <age>15</age>
    </user>
</root>

在读取xml文件时,把文件中的<user>标签映射到工程中的User对象中,然后把对象中数据输入到txt文件中。该作业配置如下:

import java.util.HashMap;
import java.util.Map;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.file.FlatFileItemWriter;
import org.springframework.batch.item.file.transform.LineAggregator;
import org.springframework.batch.item.xml.StaxEventItemReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.oxm.xstream.XStreamMarshaller;

import com.lzj.xml.reader.User;

@Configuration
public class BatchConfig1 {

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    private int chunkSize = 5;

    /*1、创建一个Job作业*/
    @Bean
    public Job xmlReaderJob() throws Exception{
        return jobBuilderFactory.get("xmlReaderJob")
        .start(chunkStep())
        .build();
    }

    //2、创建一个step*/
    @Bean
    public Step chunkStep() throws Exception{
        return stepBuilderFactory.get("chunkStep")
                .<User, User>chunk(chunkSize)                                   //每chunkSize次提交一次
                .reader(xmlItemReader())                            //读取xml文件,并把文件中每个标签中数据映射到工程中的User bean中
                .writer(userWriteItem())
                .allowStartIfComplete(true)
                .build();
    }

    //3、配置要读取文件的特性*/
    @Bean
    public ItemReader<User> xmlItemReader(){
        StaxEventItemReader<User> reader = new StaxEventItemReader<>(); //StaxEventItemReader用来读取xml文件
        reader.setResource(new ClassPathResource("/data/User.xml"));    //设置xml文件位置
        reader.setFragmentRootElementName("user");  //指定xml文件的根元素,或者在User.java类上用@XmlRootElement(name = "user")
        reader.setUnmarshaller(getMarShaller());    //把xml文件中数据映射到User.java中
        return reader;
    }

    private XStreamMarshaller getMarShaller(){
        XStreamMarshaller marShaller = new XStreamMarshaller();
        Map<String, Class> map = new HashMap<>();
        map.put("user", User.class); //把<user>标签中数据映射到User.class类中
        marShaller.setAliases(map);
        return marShaller;
    }


    //4、配置写
    @Bean
    public ItemWriter<User> userWriteItem() throws Exception{
        FlatFileItemWriter<User> fileWrite = new FlatFileItemWriter<>();
        fileWrite.setLineAggregator(new UserLineAggregator());  //设置数据聚合器,数据按什么格式写入文件
        String workFolder = System.getProperty("user.dir");     //获取工程目录
        fileWrite.setResource(new FileSystemResource(workFolder.concat("/output/UserWriter.txt")));
        fileWrite.afterPropertiesSet();     //设置完参数后进行校验,参数设置不正确时会抛异常
        return fileWrite;
    }

    /*按指定格式写入文件*/
    private class UserLineAggregator implements LineAggregator<User>{
        @Override
        public String aggregate(User item) {
            return item.getId() + ", " + item.getName() + ", " + item.getAge();
        }

    }
}

运行该job作业,会在该工程目录下生成/output/UserWrite.txt文件,其内容如下:

1, lzj, 28
2, Tom, 20
3, Jerry, 18
4, Jerry, 18
5, Bob, 25
5, Ferry, 30
6, Marry, 39
7, Linda, 20
8, Linda, 23
9, Jiken, 15
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值