SpringBatch Sample (四)(固定长格式文件读写)

前篇关于Spring Batch的文章,讲述了Spring Batch 对XML文件的读写操作。 本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对固定长格式文件的读写操作。实例延续前面的例子,读取一个含有四个字段的TXT文件(ID,Name,Age,Score),对读取的字段做简单的处理,然后输出到另外一个TXT文件中。

工程结构如下图:

applicationContext.xml和log4j.xml前文已经叙述过,在此不做赘述。

本文核心配置文件batch.xml内容如下:

按 Ctrl+C 复制代码

<?xml version="1.0" encoding="UTF-8"?>
<bean:beans xmlns="http://www.springframework.org/schema/batch"
xmlns:bean="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<bean:import resource="applicationContext.xml" />

<!-- Job信息的配置 -->
<job id="fixedLengthJob">
<step id="fixedLengthStep">
<tasklet>
<chunk reader="fixedLengthReader" writer="fixedLengthWriter"
processor="fixedLengthProcessor" commit-interval="10">
</chunk>
</tasklet>
</step>
</job>

<!-- 固定长文件的读信息的配置 -->
<bean:bean id="fixedLengthReader"
class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<bean:property name="resource"
value="file:#{jobParameters[‘inputFilePath‘]}" />
<bean:property name="lineMapper">
<bean:bean
class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<bean:property name="lineTokenizer" ref="lineTokenizer" />
<bean:property name="fieldSetMapper">
<bean:bean
class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
<bean:property name="prototypeBeanName" value="studentBean"/>
</bean:bean>
</bean:property>
</bean:bean>
</bean:property>
</bean:bean>
<bean:bean id="studentBean"
class="com.wanggc.springbatch.sample.fixedlength.StudentPojo" scope="prototype" />
<bean:bean id="lineTokenizer"
class="org.springframework.batch.item.file.transform.FixedLengthTokenizer">
<bean:property name="columns" value="1-6,7-15,16-18,19-" />
<bean:property name="names" value="ID,name,age,score" />
</bean:bean>

<!-- 固定长格式文件的写 -->
<bean:bean id="fixedLengthWriter"
class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
<bean:property name="resource"
value="file:#{jobParameters[‘outputFilePath‘]}" />
<bean:property name="lineAggregator">
<bean:bean
class="org.springframework.batch.item.file.transform.FormatterLineAggregator">
<bean:property name="fieldExtractor">
<bean:bean
class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
<bean:property name="names" value="ID,name,age,score" />
</bean:bean>
</bean:property>
<bean:property name="format" value="%-9s%-20s%3d%-2.0f" />
</bean:bean>
</bean:property>
</bean:bean>
</bean:beans>

按 Ctrl+C 复制代码

22-30行配置了Job的基本信息。此Job包含一个Step,Step中包含了基本的读(fixedLengthReader),处理(fixedLengthProcessor),写(fixedLengthWriter)以及commit件数(commit-interval)。

33-49行配置了读处理的详细信息。固定长格式和csv格式都属于flat文件格式,所以读取固定长格式文件也是需要使用Spring Batch提供的核心类FlatFileItemReader。对此类的配置在《Spring Batch 之 Sample(CSV文件操作)(四) 》中已经做过详细说明。但要注意lineTokenizer的配置,在读取CSV文件的时候,使用的是DelimitedLineTokenizer类,但是读取固定长格式的文件,需要使用FixedLengthTokenizer,如52-56行所示。其columns是如何分割一条记录信息,也就是说指定哪几列属于一个项目的信息(注意:列数的总长度与文件记录长度不一样的时候,会报错。注意限定范围)。属性names指定每个项目的名字。其名字与44行prototypeBeanName属性指定的Pojo属性名相同。

59-76行配置了写处理的详细信息。写固定长格式的文件,与写CSV格式的文件一样,也是使用Spring Batch提供的核心类FlatFileItemWriter。在此也不再赘述。但要注意lineAggregator属性使用的是FormatterLineAggregator类,此类的format属性可以指定每个项目所占的长度和格式。

batch.xml文件配置了对固定长文件的和写。在读之后,写之前的处理,是通过自定的FixedLengthProcessor 类处理的。详细代码如下:

package com.wanggc.springbatch.sample.fixedlength;

import org.springframework.batch.item.ItemProcessor;import org.springframework.stereotype.Component;

/** * 业务处理类。 *  * @author Wanggc */@Component("fixedLengthProcessor")public class FixedLengthProcessor implements        ItemProcessor<StudentPojo, StudentPojo> {

/**     * 对取到的数据进行简单的处理。     *      * @param student     *            处理前的数据。     * @return 处理后的数据。     * @exception Exception     *                处理是发生的任何异常。     */    public StudentPojo process(StudentPojo student) throws Exception {        /* 合并ID和名字 */        student.setName(student.getID() + "--" + student.getName());        /* 年龄加2 */        student.setAge(student.getAge() + 2);        /* 分数加10 */        student.setScore(student.getScore() + 10);        /* 将处理后的结果传递给writer */        return student;    }

}

至此,对固定长格式文件的读、处理、写操作已经介绍完毕。下面是一些辅助文件的信息。

Pojo类StudentPojo的详细代码如下:

package com.wanggc.springbatch.sample.fixedlength;

/** Pojo类_Student */public class StudentPojo {    /** ID */    private String ID = "";    /** 名字 */    private String name = "";    /** 年龄 */    private int age = 0;    /** 分数 */    private float score = 0;    /* 为节省篇幅,getter 和 setter 已经删除 */    }

Job启动类Launch的详细代码如下:

package com.wanggc.springbatch.sample.fixedlength;

import org.springframework.batch.core.Job;import org.springframework.batch.core.JobExecution;import org.springframework.batch.core.JobParametersBuilder;import org.springframework.batch.core.launch.JobLauncher;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Launch {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext(                "batch.xml");        JobLauncher launcher = (JobLauncher) context.getBean("jobLauncher");        Job job = (Job) context.getBean("fixedLengthJob");

try {            // JOB实行            JobExecution result = launcher.run(                    job,                    new JobParametersBuilder()                            .addString("inputFilePath",                                    "C:\\testData\\fixedLengthInputFile.txt")                            .addString("outputFilePath",                                    "C:\\testData\\fixedLengthOutputFile.txt")                            .toJobParameters());            // 运行结果输出            System.out.println(result.toString());        } catch (Exception e) {            e.printStackTrace();        }    }}

时间: 2024-10-25 22:55:43

SpringBatch Sample (四)(固定长格式文件读写)的相关文章

Linux长格式文件属性介绍

长格式文件属性 查看长格式文件命令:ll (或ls -l) (1)-:文件类型 -:普通文件 d:目录 b:块设备文件(随机读取) c:字符设备文件(顺序读取) p:管道文件 s:Socket套接字文件 l:连接文件 (2)--------:属主权限属组权限其他人权限 属主:文件或目录的所有者 属组:文件或目录的所属组 其他人:既非属主,也非属组 权限:  r →读权限,权限值4 w →写权限,权限值2 x→执行权限,权限值1 -→无权限,权限值0 (3).:代表该文件被Selinux管理 (4

JAVA用geotools读写shape格式文件

转自:http://toplchx.iteye.com/blog/1335007 JAVA用geotools读写shape格式文件 (对应geotools版本:2.7.2) (后面添加对应geotools 10.0版本的写法) 读shape文件. shape格式文件最少包含3个文件,他们的后缀是:.shp, .dbf, .shx. .shp存储地理形状和位置信息,.dbf存储属性信息,.shx是索引文件. 单独读取DBF文件 public void readDBF(String path) {

java将数据写入到txt文件中(txt有固定的格式)

java将数据写入到txt文件中,这个应该对于学过java I/O的人来说是很简单的事情了,但是如果要将数据以固定的格式写入到txt文件中,就需要一定的技巧了. 这里举个简单的例子,以供参考: 比如我要将数据写成下面的样子: 1      |      2      |        3       |        4 5      |      6      |        8       |        9 也许看起来很简单的,因为每个数据所代表的长度是不一样的,也有可能编码不一样,所

Python怎么读写json格式文件

JSON-是一个轻量级的数据交换格式.点击打开百度百科 JSON维基百科:http://zh.wikipedia.org/wiki/JSON json模块 关于json的官方文档:点击打开链接 本文由@The_Third_Wave(Blog地址:http://blog.csdn.net/zhanh1218)原创.不定期更新,有错误请指正. Sina微博关注:@The_Third_Wave 如果这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!如果您一定要转载,请带上后缀和本文地址. d

C#读取固定文本格式的txt文件

C#读取固定文本格式的txt文件 一个简单的C#读取txt文档的程序,文档中用固定的格式存放着实例数据. //判断关键字在文档中是否存在 var isTr = File.ReadAllLines("1.txt").Any(x => x.Split(',')[0] == "设备ID:107157061").ToString(); //获取序列中满足查询条件的第一条数据 var a = File.ReadAllLines("1.txt").Fi

Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化

IO编程 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.从磁盘读取文件到内存,就只有Input操作,反过来,把数据写到磁盘文件里,就只是一个Output操作. 由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题.举个例子来说,比如要把100M的数据写入磁盘,CPU输出100M的数据只需要0.01秒,可是磁盘要接收这10

linux网络分析、性能分析、文本格式化、文件读写操作之利器

好的工具能够让我们工作更加高效,结合工作中的情况,今天分享下linux下比较好用的几个工具. 网络分析工具 mtr mtr是网络链路检测判断问题非常好用的工具,集成了tracert和ping这两个命令的功能,动态的输出检测结果.mtr 默认发送icmp数据包进行链路探测,会对链路上的相关节点做持续探测并给出相应的统计信息,mtr 能避免节点波动对测试结果的影响其中中间线路丢包严重但是目标地址不丢包,可能是因为某些主机路由对icmp协议不做处理或者只分配固定限额的资源处理,所以是正常情况.因为ic

C语言文件读写操作总结

C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了.当使用打开函数时,必须给出文件名.文件操作方式(读.写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头.若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头. fopen(char

shell学习四十一天----列出文件ls和od命令

列出文件 首先恶臭命令提供简单的方式列出匹配模式的文件: 命令: echo /bin/*sh #显示/bin下的shell 输出:/bin/bash /bin/csh /bin/dash /bin/sh /bin/tcsh 分析:shell将通配符字符模式替换为匹配的文件列表,echo以空格区分文件列表,在单一行上显示他们.echp不会更近一部解释他的参数,因此与文件系统里的文件也没有任何关系. ls命令则比echo能做更多的处理,因为他纸袋自己的参数应该是文件.未提供命令行选项时,ls只会验证