如何配置 FlatFileItemWriter 以将文件输出到 ByteArrayRecource?

how to configure FlatFileItemWriter to output the file to a ByteArrayRecource?

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

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

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

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

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

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

我有类似的问题 - 我想要 write/read GCP 云存储文件。我使用 https://github.com/ncelq/spring-batch-gcs/blob/master/src/main/java/com/cloud/sample/GSFileWriter.java 中的示例,但未写入 header/footer。

  @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

我将不胜感激。