spring batch提供了StaxEventItemWriter,用来把数据写入到xml文件中。
示例:把下面User.txt文件中的数据写入到xml文件中。
ID,NAME,AGE
1,lzj,28
2,tom,20
3,terry,30
4,lerry,18
5,bob,25
6,linda,27
7,marry,39
8,long,22
9,kin,33
10,jiken,40
首先读取txt文件,把数据映射到工程中的User对象中,然后把对象中数据写入xml文件。该作业配置如下:
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.FlatFileItemReader;
import org.springframework.batch.item.file.LineMapper;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.batch.item.file.transform.LineTokenizer;
import org.springframework.batch.item.xml.StaxEventItemWriter;
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 org.springframework.validation.BindException;
@Configuration
public class BatchConfig {
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private JobBuilderFactory jobBuilderFactory;
/*1、创建一个Job作业*/
@Bean
public Job fileReaderJob() throws Exception{
return jobBuilderFactory.get("fileReaderJob")
.start(chunkStep())
.build();
}
//2、创建一个step*/
@Bean
public Step chunkStep() throws Exception{
return stepBuilderFactory.get("chunkStep")
.<User, User>chunk(4) //每4次提交一次
.reader(txtItemReader()) //读取文件,并把文件中每行数据映射到工程中的User bean中
.writer(xmlItemWrite()) //写入xml文件
.allowStartIfComplete(true)
.build();
}
//3、配置要读取文件的特性*/
@Bean
public ItemReader<User> txtItemReader(){
FlatFileItemReader<User> reader= new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("/data/User.txt")); //指定读取文件的位置
reader.setLinesToSkip(1); //文件的第一行不用读取,跳过第一行
reader.setLineMapper(userLineMapper()); //设置lineMapper,用于把文件中的每行数据映射到工程的bean中
return reader;
}
//3.1 定义一个LineMapper,用于把文件中的每行数据映射到工程的bean中*/
private LineMapper<User> userLineMapper(){
DefaultLineMapper<User> lineMapper = new DefaultLineMapper<>();
lineMapper.setLineTokenizer(userLineTokenizer()); //设置文件的解析器
lineMapper.setFieldSetMapper(new UserFieldStepMapper()); //设置文件的映射器
lineMapper.afterPropertiesSet(); //完成文件的配置
return lineMapper;
}
//3.2 定义文件的解析器,解析文件中的ID、NAME、AGE三列*/
private LineTokenizer userLineTokenizer(){
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames(new String[]{"ID", "NAME", "AGE"});
return tokenizer;
}
//3.3 实现FieldSetMapper,用于从User.txt文件中读取数据,用读取的数据创建工程中的User对象*/
private static class UserFieldStepMapper implements FieldSetMapper<User>{
/*一个fieldSed对应文件中的一行数据*/
@Override
public User mapFieldSet(FieldSet fieldSet) throws BindException {
// TODO Auto-generated method stub
return new User(fieldSet.readString("ID"),
fieldSet.readString("NAME"),
fieldSet.readString("AGE"));
}
}
/*4、配置写入xml文件*/
@Bean
public ItemWriter<User> xmlItemWrite() throws Exception{
StaxEventItemWriter<User> write = new StaxEventItemWriter<>();
write.setRootTagName("ROOT");
write.setMarshaller(createMarshaller());
String workFolder = System.getProperty("user.dir");
write.setResource(new FileSystemResource(workFolder.concat("/output/UserWrite.xml")));
write.afterPropertiesSet();
return write;
}
/*把User映射到Xml中的标签*/
private XStreamMarshaller createMarshaller(){
XStreamMarshaller marshaller = new XStreamMarshaller();
Map<String, Class> aliases = new HashMap<>();
aliases.put("user", User.class); //把User对象中的数据映射到<user>标签中
marshaller.setAliases(aliases);
return marshaller;
}
}
运行该作业,在工程目录下的output文件生成一个UserWrite.xml文件,内容如下:
<?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>terry</name>
<age>30</age>
</user>
<user>
<id>4</id>
<name>lerry</name>
<age>18</age>
</user>
<user>
<id>5</id>
<name>bob</name>
<age>25</age>
</user>
<user>
<id>6</id>
<name>linda</name>
<age>27</age>
</user>
<user>
<id>7</id>
<name>marry</name>
<age>39</age>
</user>
<user>
<id>8</id>
<name>long</name>
<age>22</age>
</user>
<user>
<id>9</id>
<name>kin</name>
<age>33</age>
</user>
<user>
<id>10</id>
<name>jiken</name>
<age>40</age>
</user>
</ROOT>
写入成功!