gpt4 book ai didi

spring-batch - Spring Batch 处理编码的压缩文件

转载 作者:行者123 更新时间:2023-12-04 04:07:03 30 4
gpt4 key购买 nike

我正在研究使用 spring 批处理来处理编码压缩文件中的记录。记录是可变长度的,其中编码了嵌套的可变长度数据字段。

我是 Spring 和 Spring Batch 的新手,这就是我计划构建批处理配置的方式。

  • ItemReader 需要将压缩 (*.gz) 文件输入流中的单个记录读取到 POJO(字节数组)中,该记录的长度将包含在流的前两个字节中。
  • ItemProcessor 将解码字节数组并将信息存储在 POJO 的相关属性中。
  • ItemWriter 将填充数据库。

  • 我最初的问题是理解如何设置 ItemReader,我看过一些使用 FlatFileItemReader 的例子,但我的困难是期望有一个 Line Mapper。在我的情况下,我不知道如何做到这一点(文件中没有一行的概念)。

    有一些 articles指示使用自定义 BufferedReaderFactory,但很高兴看到一个工作示例。

    帮助将不胜感激。

    最佳答案

    如果gzipped 文件是一个简单的txt 文件,你只需要一个custum BufferedReaderFactory,linemaper 然后获取当前行的String

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.zip.GZIPInputStream;
    import org.springframework.batch.item.file.BufferedReaderFactory;
    import org.springframework.core.io.Resource;

    public class GZipBufferedReaderFactory implements BufferedReaderFactory {

    /** Default value for gzip suffixes. */
    private List<String> gzipSuffixes = new ArrayList<String>() {

    {
    add(".gz");
    add(".gzip");
    }
    };

    /**
    * Creates Bufferedreader for gzip Resource, handles normal resources
    * too.
    *
    * @param resource
    * @param encoding
    * @return
    * @throws UnsupportedEncodingException
    * @throws IOException
    */
    @Override
    public BufferedReader create(Resource resource, String encoding)
    throws UnsupportedEncodingException, IOException {
    for (String suffix : gzipSuffixes) {
    // test for filename and description, description is used when
    // handling itemStreamResources
    if (resource.getFilename().endsWith(suffix)
    || resource.getDescription().endsWith(suffix)) {
    return new BufferedReader(new InputStreamReader(new GZIPInputStream(resource.getInputStream()), encoding));
    }
    }
    return new BufferedReader(new InputStreamReader(resource.getInputStream(), encoding));
    }

    public List<String> getGzipSuffixes() {
    return gzipSuffixes;
    }

    public void setGzipSuffixes(List<String> gzipSuffixes) {
    this.gzipSuffixes = gzipSuffixes;
    }
    }

    简单的 itemreader 配置:

     <bean id="itemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
    <property name="resource" value="#{jobParameters['input.file']}" />
    <property name="lineMapper">
    <bean class="org.springframework.batch.item.file.mapping.PassThroughLineMapper" />
    </property>
    <property name="strict" value="true" />
    <property name="bufferedReaderFactory">
    <bean class="your.custom.GZipBufferedReaderFactory" />
    </property>
    </bean>

    关于spring-batch - Spring Batch 处理编码的压缩文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31984393/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com