对于最新稳定版本,请使用Spring Batch Documentation 6.0.0spring-doc.cadn.net.cn

平板文件物品写手

写入扁平文件和从文件读取时遇到的问题和问题一样 必须克服。步骤必须能够在 交易式的态度。spring-doc.cadn.net.cn

线路聚合器

就像LineTokenizer接口是将物品转化为字符串,文件写入必须有方法将多个字段聚合到一个字符串中 用于写入文件。在春季批中,这是线路聚合器,在 以下是接口定义:spring-doc.cadn.net.cn

public interface LineAggregator<T> {

    public String aggregate(T item);

}

线路聚合器是 的逻辑对立LineTokenizer.LineTokenizer需要一个字符串并返回野外集线路聚合器项目并返回字符串.spring-doc.cadn.net.cn

直通线聚合器

最基本的实现线路聚合器接口是直通线聚合器假设对象已经是一个字符串,或者 其字符串表示法可用于写入,如下代码所示:spring-doc.cadn.net.cn

public class PassThroughLineAggregator<T> implements LineAggregator<T> {

    public String aggregate(T item) {
        return item.toString();
    }
}

如果直接控制创建字符串 必要但具有优势平板文件物品写手,例如交易和重启 支持是必要的。spring-doc.cadn.net.cn

简化文件写入示例

现在线路聚合器接口及其最基本的实现,直通线聚合器,已经定义,基本的写作流程可以是 解释:spring-doc.cadn.net.cn

  1. 要写入的对象传递给线路聚合器为了获得字符串.spring-doc.cadn.net.cn

  2. 归来者字符串写入配置文件。spring-doc.cadn.net.cn

以下是摘自平板文件物品写手用代码表达如下:spring-doc.cadn.net.cn

public void write(T item) throws Exception {
    write(lineAggregator.aggregate(item) + LINE_SEPARATOR);
}

在 Java 中,一个简单的配置示例可能如下:spring-doc.cadn.net.cn

Java 配置
@Bean
public FlatFileItemWriter itemWriter() {
	return  new FlatFileItemWriterBuilder<Foo>()
           			.name("itemWriter")
           			.resource(new FileSystemResource("target/test-outputs/output.txt"))
           			.lineAggregator(new PassThroughLineAggregator<>())
           			.build();
}

在 XML 中,一个简单的配置示例可能如下:spring-doc.cadn.net.cn

XML 配置
<bean id="itemWriter" class="org.spr...FlatFileItemWriter">
    <property name="resource" value="file:target/test-outputs/output.txt" />
    <property name="lineAggregator">
        <bean class="org.spr...PassThroughLineAggregator"/>
    </property>
</bean>

场提取器

上述示例对于写入文件的最基本用途可能非常有用。 然而,大多数用户平板文件物品写手拥有一个域对象,需要 写出后必须转换为一行。在文件读取中,如下内容 必填:spring-doc.cadn.net.cn

  1. 读文件里的一句话。spring-doc.cadn.net.cn

  2. 将线传递到,LineTokenizer#tokenize()方法,以检索野外集.spring-doc.cadn.net.cn

  3. 传给野外集从分词化到AFieldSetMapper,返回 结果由ItemReader#read()方法。spring-doc.cadn.net.cn

文件写入步骤类似但相反:spring-doc.cadn.net.cn

  1. 把待写的题目交给写手。spring-doc.cadn.net.cn

  2. 将该项上的字段转换为数组。spring-doc.cadn.net.cn

  3. 将生成的数组聚合成一行。spring-doc.cadn.net.cn

因为框架无法知道对象中哪些字段需要 被写出去,a场提取器必须写成以完成转 如以下接口定义所示,项目被纳入数组:spring-doc.cadn.net.cn

public interface FieldExtractor<T> {

    Object[] extract(T item);

}

实现场提取器接口应从字段中创建数组 给定对象的,然后可以用分隔符写出 元素或作为固定宽度直线的一部分。spring-doc.cadn.net.cn

PassThroughFieldExtractor

有许多情况下,集合,如数组,收集野外集, 需要写出来。从这些集合类型中“提取”数组非常难 简单。为此,将集合转换为数组。因此,PassThroughFieldExtractor在这种情况下应该使用。需要注意的是,如果 传递的对象不是集合类型,那么PassThroughFieldExtractor返回仅包含待提取项的数组。spring-doc.cadn.net.cn

豆包场提取器

BeanWrapperFieldSetMapper文件阅读部分描述的,是 通常更倾向于配置如何将域对象转换为对象数组, 比起自己写转换文。这豆包场提取器提供以下条件 功能,如下示例所示:spring-doc.cadn.net.cn

BeanWrapperFieldExtractor<Name> extractor = new BeanWrapperFieldExtractor<>();
extractor.setNames(new String[] { "first", "last", "born" });

String first = "Alan";
String last = "Turing";
int born = 1912;

Name n = new Name(first, last, born);
Object[] values = extractor.extract(n);

assertEquals(first, values[0]);
assertEquals(last, values[1]);
assertEquals(born, values[2]);

该提取器实现仅具备一个必需属性:字段名称为 地图。就像BeanWrapperFieldSetMapper需要字段名来映射野外集对给定对象的 setter,即豆包场提取器需要命名 映射到生成对象数组的获取器。值得注意的是,该阶数的 名称决定了数组中字段的顺序。spring-doc.cadn.net.cn

分隔文件写入示例

最基本的平面文件格式是所有字段都用分隔符分隔。 这可以通过DelimitedLine聚合器.以下示例写道 输出一个简单的域对象,表示客户账户的信用:spring-doc.cadn.net.cn

public class CustomerCredit {

    private int id;
    private String name;
    private BigDecimal credit;

    //getters and setters removed for clarity
}

由于正在使用域对象,实现了场提取器必须提供接口,以及使用分隔符。spring-doc.cadn.net.cn

以下示例展示了如何使用场提取器带有 Java 分隔符:spring-doc.cadn.net.cn

Java 配置
@Bean
public FlatFileItemWriter<CustomerCredit> itemWriter(Resource outputResource) throws Exception {
	BeanWrapperFieldExtractor<CustomerCredit> fieldExtractor = new BeanWrapperFieldExtractor<>();
	fieldExtractor.setNames(new String[] {"name", "credit"});
	fieldExtractor.afterPropertiesSet();

	DelimitedLineAggregator<CustomerCredit> lineAggregator = new DelimitedLineAggregator<>();
	lineAggregator.setDelimiter(",");
	lineAggregator.setFieldExtractor(fieldExtractor);

	return new FlatFileItemWriterBuilder<CustomerCredit>()
				.name("customerCreditWriter")
				.resource(outputResource)
				.lineAggregator(lineAggregator)
				.build();
}

以下示例展示了如何使用场提取器带有XML分隔符:spring-doc.cadn.net.cn

XML 配置
<bean id="itemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
    <property name="resource" ref="outputResource" />
    <property name="lineAggregator">
        <bean class="org.spr...DelimitedLineAggregator">
            <property name="delimiter" value=","/>
            <property name="fieldExtractor">
                <bean class="org.spr...BeanWrapperFieldExtractor">
                    <property name="names" value="name,credit"/>
                </bean>
            </property>
        </bean>
    </property>
</bean>

在前述例子中,豆包场提取器本文前述 章节用于转入名称和信用字段客户信用变成一个对象 array,然后用逗号在每个字段之间写出来。spring-doc.cadn.net.cn

也可以使用FlatFileItemWriterBuilder.DelimitedBuilder自 自动创建豆包场提取器DelimitedLine聚合器如下例所示:spring-doc.cadn.net.cn

Java 配置
@Bean
public FlatFileItemWriter<CustomerCredit> itemWriter(Resource outputResource) throws Exception {
	return new FlatFileItemWriterBuilder<CustomerCredit>()
				.name("customerCreditWriter")
				.resource(outputResource)
				.delimited()
				.delimiter("|")
				.names(new String[] {"name", "credit"})
				.build();
}

没有XML对应的使用方法FlatFileItemWriterBuilder.spring-doc.cadn.net.cn

固定宽度文件写入示例

分界线并不是唯一的扁平文件格式。许多人更喜欢使用固定宽度 每一列用于区分字段间,通常称为“固定宽度”。 Spring Batch 支持通过FormatterLineAggregator.spring-doc.cadn.net.cn

使用相同方法客户信用上述域对象,可以配置为 以下是 Java 版本:spring-doc.cadn.net.cn

Java 配置
@Bean
public FlatFileItemWriter<CustomerCredit> itemWriter(Resource outputResource) throws Exception {
	BeanWrapperFieldExtractor<CustomerCredit> fieldExtractor = new BeanWrapperFieldExtractor<>();
	fieldExtractor.setNames(new String[] {"name", "credit"});
	fieldExtractor.afterPropertiesSet();

	FormatterLineAggregator<CustomerCredit> lineAggregator = new FormatterLineAggregator<>();
	lineAggregator.setFormat("%-9s%-2.0f");
	lineAggregator.setFieldExtractor(fieldExtractor);

	return new FlatFileItemWriterBuilder<CustomerCredit>()
				.name("customerCreditWriter")
				.resource(outputResource)
				.lineAggregator(lineAggregator)
				.build();
}

使用相同方法客户信用上述域对象,可以配置为 以下为 XML 格式:spring-doc.cadn.net.cn

XML 配置
<bean id="itemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
    <property name="resource" ref="outputResource" />
    <property name="lineAggregator">
        <bean class="org.spr...FormatterLineAggregator">
            <property name="fieldExtractor">
                <bean class="org.spr...BeanWrapperFieldExtractor">
                    <property name="names" value="name,credit" />
                </bean>
            </property>
            <property name="format" value="%-9s%-2.0f" />
        </bean>
    </property>
</bean>

前面的大部分例子应该都很熟悉。然而,这种形式的价值 房产是新的。spring-doc.cadn.net.cn

以下示例展示了 Java 中的格式属性:spring-doc.cadn.net.cn

...
FormatterLineAggregator<CustomerCredit> lineAggregator = new FormatterLineAggregator<>();
lineAggregator.setFormat("%-9s%-2.0f");
...

以下示例展示了XML中的格式属性:spring-doc.cadn.net.cn

<property name="format" value="%-9s%-2.0f" />

底层实现也是用同样的方法构建的福尔马特作为Java 5的一部分加入。爪哇河福尔马特基于印刷C 编程的功能 语言。关于如何配置格式化器的大部分细节都可以在 Formatter的Javadoc。spring-doc.cadn.net.cn

也可以使用FlatFileItemWriterBuilder.FormattedBuilder自 自动创建豆包场提取器FormatterLineAggregator如下例所示:spring-doc.cadn.net.cn

Java 配置
@Bean
public FlatFileItemWriter<CustomerCredit> itemWriter(Resource outputResource) throws Exception {
	return new FlatFileItemWriterBuilder<CustomerCredit>()
				.name("customerCreditWriter")
				.resource(outputResource)
				.formatted()
				.format("%-9s%-2.0f")
				.names(new String[] {"name", "credit"})
				.build();
}

处理文件创建

FlatFileItemReader与文件资源的关系非常简单。当读者 当初始化时,它会打开该文件(如果存在的话),如果没有,则抛出异常。 写文件没那么简单。乍一看,似乎很相似 应有明确的合同平板文件物品写手:如果文件已经 存在,抛出异常,如果没有,就创建它并开始写入。然而 可能会重新开始工作可能会引发问题。在正常的重启场景中, 合同反过来:如果文件存在,就从最后已知的物品开始写入 位置,如果不符合,则抛出异常。但是,如果文件名 因为这份工作总是一样的吗?在这种情况下,如果有 存在,除非是重启。正因为这种可能性,平板文件物品写手包含性质,应该删除如果存在.将该属性设为真时,会产生 同名的现有文件,在写入者打开时删除。spring-doc.cadn.net.cn