Spring Batch:文件的批量读写Flatfile(XML,CSV,TXT)

栏目: Java · 发布时间: 8年前

内容简介:Spring Batch:文件的批量读写Flatfile(XML,CSV,TXT)

该系列课程中的示例代码使用springBatch版本为3.0.7;讲解可能会讲一些4.0.X的特性

示例代码地址: https://git.oschina.net/huicode/springbatch-learn

在这里说到FlatFile的时候,其实XML,CSV,TXT三种文件格式中XML是不属于FlatFile 的,XML在Batch中是属于StaxEvent,但是本章主要讲述SpringBatch对于文件的读写,所以放到一起说明。

本文主要讲解通过SpringBatch来处理文本格式的文件,在实际的业务中也许文本文件转DB data或者DB data转文本文件的情形更多。

说明:在spring官方文档中的说明都是基于xml配置的方式来实现ItemReader、ItemWriter、Job、Step的配置的,为了符合springBoot的配置方式,示例代码都是配置代码实现的。

使用springBatch对于 xml 文件进行读写 操作时需要引入spring-oxm 包

pom.xml配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-oxm</artifactId>
    <version>4.3.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

项目结构说明

Spring Batch:文件的批量读写Flatfile(XML,CSV,TXT)

为了更好的管理代码,根据类对应的职责创建了不同的包:

  • launcher: 执行,调用job
  • processor: 负责数据的转换与处理

文件读写

使用 FlatFileItemReader,FlatFileItemWriter 帮我们做了什么?

  1. FlatFileItem 能够以固定长度进行读写(对于大文件尤为重要),开发者不用关注文件的读写流问题
  2. 对文件读写时能够保证事物

详解 FlatFileItemReader

FlatFileItemReader 是对文件读取的类,一般是对表格数据,或者文本文件数据的处理。该类的以下两个属性是必须要set的

  • setResource 指定文件资源的位置:通过ClassPathResource(类所在路径)或者FileSystemResource(文件系统所在路径)来指定要读取的文件
  • setLineMapper 行映射:指定行与实体对象之间的映射关系,示例代码使用了DefaultLineMapper
  • seEncoding 读取编码格式,默认为 iso-8859-1
  • setStrict 严格模式,输入文件不存在会抛出异常,阻断当前job,默认为true
@Bean
   publicFlatFileItemReader<Person>csvItemReader(){
       FlatFileItemReader<Person> csvItemReader = new FlatFileItemReader<>();
       csvItemReader.setResource(new ClassPathResource("data/sample-data.csv"));
       csvItemReader.setLineMapper(new DefaultLineMapper<Person>() {{
           setLineTokenizer(new DelimitedLineTokenizer() {{
               setNames(new String[]{"name", "age"});
           }});
           setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
               setTargetType(Person.class);
           }});
       }});
       return csvItemReader;
   }

详解 FlatFileItemWriter

FlatFileItemWriter 是对文件的写入类,将批量数据流写入文件,该类使用必须了解下面几个方法的用法:

  • setLineAggregator 和 FlatFileItemReader 的setLineMapper方法有着相似之处,setLineAggregator方法是将对象属性聚合为字符串,聚合时根据需要设置分隔符(setDelimiter),以及对象属性对应的字符名称(setFieldExtractor)
    • LineAggregator 接口是创建对象属性聚合字符串
    • ExtractorLineAggregator 是抽象类实现LineAggregator接口。使用 FieldExtractor将对象属性转换为数组,该类的扩展类负责将数组转换字符串(doAggregate)
      • DelimitedLineAggregator 继承 ExtractorLineAggregator。是一种更常使用的聚合方式、将数组用指定符号分割,默认使用逗号
      • FormatterLineAggregator 继承 ExtractorLineAggregator。对数组字符串的最大长度,最小长度的校验,以及格式化操作
    • PassThroughLineAggregator 实现LineAggregator接口,是一种简单的聚合方式使用对象的.toString()返回值,作为聚合字符串
    • RecursiveCollectionLineAggregator 实现LineAggregator接口,将Collection 集合遍历,集合的聚合通过系统行分割符分割,对象字段的聚合使用LineAggregator接口对应的聚合方法是可选择的。
  • setResource 是指定输出文件的位置,同样也是必须的,示例代码中使用了new ClassPathResource(“/data/sample-data.txt”) 实际开发中更多的是 new FilePathResource()
  • setEncoding 设置编码,默认也是 iso-8859-1

Spring Batch:文件的批量读写Flatfile(XML,CSV,TXT)

@Bean
publicFlatFileItemWriter<Person>txtItemWriter(){
    FlatFileItemWriter<Person> txtItemWriter = new FlatFileItemWriter<>();
    txtItemWriter.setAppendAllowed(true);
    txtItemWriter.setEncoding("UTF-8");
    txtItemWriter.setResource(new ClassPathResource("/data/sample-data.txt"));
    txtItemWriter.setLineAggregator(new DelimitedLineAggregator<Person>() {{
        setDelimiter(",");
        setFieldExtractor(new BeanWrapperFieldExtractor<Person>() {{
            setNames(new String[]{"name", "age"});
        }});
    }});
    return txtItemWriter;
}

XML文件处理

对xml文件的处理需要引入spring-oxm包,仅对xml的输出进行详解,XML读取类似

对xml写入操作的对象为StaxEventItemWriter,与FlatFileItemWriter的使用类似,StaxEventItemWriter 与 FlatFileItemWriter都有着setResource方法,StaxEventItemWriter默认编码为utf-8

  • setRootTagName 设置根节点标签名称
  • setMarshaller 指定对象与节点 映射关系

自定义处理器ItemProcessor

ItemProcessor主要负责数据的转换与处理,将读取到的文件 转换为输出文件的对象,所以temProcessor 这里不一定都是Person,实现process方法,实现数据的转换与处理。

public class PersonItemProcessorimplements ItemProcessor<Person,Person>{
    @Override
    publicPersonprocess(Person person)throwsException{
        person.setAge(person.getAge() + 1);
        person.setName(person.getName() + "-_-");
        return person;
    }
}

整个Job 的处理流程

  • 读取csv文件
  • 数据处理,转换
  • 输出txt文件
  • 读取txt文件
  • 数据处理,转换
  • 输出XML文件

Spring Batch:文件的批量读写Flatfile(XML,CSV,TXT)

如果您有任何想法或问题需要讨论或交流,可进入交流区发表您的想法或问题。


以上所述就是小编给大家介绍的《Spring Batch:文件的批量读写Flatfile(XML,CSV,TXT)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Essential ActionScript 3.0

Essential ActionScript 3.0

Colin Moock / Adobe Dev Library / June 22, 2007 / $34.64

ActionScript 3.0 is a huge upgrade to Flash's programming language. The enhancements to ActionScript's performance, feature set, ease of use, cleanliness, and sophistication are considerable. Essentia......一起来看看 《Essential ActionScript 3.0》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具