【问题标题】:how to configure FlatFileItemWriter to output the file to a ByteArrayRecource?如何配置 FlatFileItemWriter 将文件输出到 ByteArrayRecource?
【发布时间】:2021-05-17 21:38:18
【问题描述】:

我遇到部署服务器不允许应用程序将文件输出到其文件系统的情况......所以我要做的是配置FlatFileItemWriter 以将结果文件输出到静态Resource 属性(多线程在这里不是问题)。 我目前的代码是

...
flatFileItemWriter.setResource(new FileSystemResource("outputBatch/users.csv"));
...

有什么方法可以将此文件输出到静态资源属性以供以后访问,例如 ByteArrayResourceInMemoryResource 。 提前致谢

【问题讨论】:

    标签: java spring-boot spring-batch


    【解决方案1】:

    FlatFileItemWriter 旨在将项目写入平面文件或表示文件的可写Resource。以下是其Javadoc的摘录:

    The location of the output file is defined by a Resource and must represent a writable file.
    

    因此,在您的情况下,您需要使用自定义编写器将项目写入内存资源。

    【讨论】:

    • 我一直在等待你的回答,谢谢你,Mahmoud,我现在可以放弃FlatFileItemWriter 来定制一个了。
    • 谢谢你,总是乐于助人!如果答案有帮助,请接受或点赞。
    【解决方案2】:

    我有类似的问题 - 我想写入/读取 GCP 云存储文件。我使用来自https://github.com/ncelq/spring-batch-gcs/blob/master/src/main/java/com/cloud/sample/GSFileWriter.java 的示例,但没有写入页眉/页脚。

      @Bean
      @StepScope
      public GCSFileWriter<MyClass> myClassGcsWriter() throws IOException {
        final Resource outputResource = this.gcpLoader.getResource("gs://my-bucket/myfile");
        final GCSFileWriter<MyClass> writer = new GCSFileWriter<>();
        final Storage storage = StorageOptions.newBuilder().setCredentials(GoogleCredentials.getApplicationDefault()).build().getService();
        writer.setStorage(storage);
        writer.setResource(outputResource);
    
        final FormatterLineAggregator<MyClass> formatterLineAggregator = new FormatterLineAggregator<>();
        final BeanWrapperFieldExtractor<MyClass> beanWrapperFieldExtractor = new BeanWrapperFieldExtractor<>();
        beanWrapperFieldExtractor.setNames(FlatFileFormatConverter.getNames(MyClass.class, false, true));
        formatterLineAggregator.setFieldExtractor(beanWrapperFieldExtractor);
        formatterLineAggregator.setFormat(FlatFileFormatConverter.getFormat(MyClass.class, true));
    
        writer.setShouldDeleteIfExists(true);
        writer.setLineAggregator(formatterLineAggregator);
        writer.setHeaderCallback(getFileHeaderCallback(null));
        writer.setFooterCallback(getFileFooterCallback(null));
    
        return writer;
      }
    

    如果我使用标准 FlatFileItemWriter 保存页眉和页脚

        final Resource outputResource = new FileSystemResource("somedirectory/myfile");
    
    // @formatter:off
    return new FlatFileItemWriterBuilder<MyClass>()
        .name("myClassWriter")
        .resource(outputResource)
        .formatted()
        .format(FlatFileFormatConverter.getFormat(MyClass.class, true))
        .names(FlatFileFormatConverter.getNames(MyClass.class, false, true))
        .shouldDeleteIfExists(true)
        .headerCallback(getFileHeaderCallback(null))
        .footerCallback(getFileFooterCallback(null))
        .build();
    // @formatter:on
    

    我将不胜感激。

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多