如何配置 FlatFileItemWriter 以将文件输出到 ByteArrayRecource?
how to configure FlatFileItemWriter to output the file to a ByteArrayRecource?
我遇到部署服务器不允许应用程序将文件输出到其文件系统的情况...所以我想做的是配置 FlatFileItemWriter
以输出结果文件到静态 Resource
属性(这里多线程不是问题)。
我目前的代码是
...
flatFileItemWriter.setResource(new FileSystemResource("outputBatch/users.csv"));
...
有什么方法可以将此文件输出到静态资源 属性 以便稍后访问,例如 ByteArrayResource
或 InMemoryResource
。
提前致谢
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
我将不胜感激。
我遇到部署服务器不允许应用程序将文件输出到其文件系统的情况...所以我想做的是配置 FlatFileItemWriter
以输出结果文件到静态 Resource
属性(这里多线程不是问题)。
我目前的代码是
...
flatFileItemWriter.setResource(new FileSystemResource("outputBatch/users.csv"));
...
有什么方法可以将此文件输出到静态资源 属性 以便稍后访问,例如 ByteArrayResource
或 InMemoryResource
。
提前致谢
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
我将不胜感激。