Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring批处理-获取有关目录中文件的信息_Spring_Spring Batch - Fatal编程技术网

Spring批处理-获取有关目录中文件的信息

Spring批处理-获取有关目录中文件的信息,spring,spring-batch,Spring,Spring Batch,所以我第一次玩弄SpringBatch,试图了解如何处理CSV文件以外的事情 例如,尝试读取目录中的每个音乐文件时,我有以下代码,但我不确定如何处理委托部分 @Configuration @EnableBatchProcessing public class BatchConfiguration { @Autowired public JobBuilderFactory jobBuilderFactory; @Autowired public StepBuil

所以我第一次玩弄SpringBatch,试图了解如何处理CSV文件以外的事情

例如,尝试读取目录中的每个音乐文件时,我有以下代码,但我不确定如何处理
委托
部分

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    public MusicItemProcessor processor() {
        return new MusicItemProcessor();
    }

    @Bean
    public Job readFiles() {
        return jobBuilderFactory.get("readFiles").incrementer(new RunIdIncrementer()).
                flow(step1()).end().build();
    }

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1").<String, String>chunk(10)
                .reader(reader())
                .processor(processor()).build();
    }

    @Bean
    public ItemReader<String> reader() {
        Resource[] resources = null;
        ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
        try {
            resources = patternResolver.getResources("file:/music/*.flac");
        } catch (IOException e) {
            e.printStackTrace();
        }

        MultiResourceItemReader<String> reader = new MultiResourceItemReader<>();
        reader.setResources(resources);
        reader.setDelegate(new FlatFileItemReader<>()); // ??

        return reader;
    }

}
@配置
@启用批处理
公共类批处理配置{
@自动连线
公共建筑商建筑商工厂;
@自动连线
公共StepBuilderFactory StepBuilderFactory;
@豆子
公共音乐处理器(){
返回新的MusicItemProcessor();
}
@豆子
公共作业读取文件(){
返回jobBuilderFactory.get(“readFiles”).incrementer(新的RunIdIncrementer())。
流程(步骤1()).end().build();
}
@豆子
公共步骤第1步(){
返回stepBuilderFactory.get(“step1”).chunk(10)
.reader(reader())
.processor(processor()).build();
}
@豆子
公共项目阅读器(){
Resource[]resources=null;
ResourcePatternResolver patternResolver=新路径匹配ResourcePatternResolver();
试一试{
resources=patternsolver.getResources(“文件:/music/*.flac”);
}捕获(IOE异常){
e、 printStackTrace();
}
MultiResourceItemReader=新的MultiResourceItemReader();
reader.setResources(resources);
setDelegate(新的FlatFileItemReader());/??
返回读取器;
}
}
目前我可以看到resources有一个音乐文件列表,但看看我得到的stacktrace,我觉得
new FlatFileItemReader()
正在尝试读取文件的实际内容(我想在某个时候这样做,只是现在不想)

目前,我只想要有关文件的信息(绝对路径、大小、文件名等),而不是里面的信息

我是不是完全错了?还是我只需要配置一些不同的东西


任何不仅仅处理CSV行的代码示例都将非常棒

在浏览了互联网之后,我成功地收集了一些我认为有效的东西。。。欢迎提供一些反馈

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    public VideoItemProcessor processor() {
        return new VideoItemProcessor();
    }

    @Bean
    public Job readFiles() {
        return jobBuilderFactory.get("readFiles")
                .start(step())
                .build();
    }

    @Bean
    public Step step() {
        try {
            return stepBuilderFactory.get("step").<File, Video>chunk(500)
                    .reader(directoryItemReader())
                    .processor(processor())
                    .build();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Bean
    public DirectoryItemReader directoryItemReader() throws IOException {
        return new DirectoryItemReader("file:/media/media/Music/**/*.flac");
    }
}
@配置
@启用批处理
公共类批处理配置{
@自动连线
公共建筑商建筑商工厂;
@自动连线
公共StepBuilderFactory StepBuilderFactory;
@豆子
公共VideoItemProcessor(){
返回新的VideoItemProcessor();
}
@豆子
公共作业读取文件(){
返回jobBuilderFactory.get(“readFiles”)
.start(步骤())
.build();
}
@豆子
公共步骤(){
试一试{
返回stepBuilderFactory.get(“step”).chunk(500)
.reader(directoryItemReader())
.processor(处理器())
.build();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
@豆子
public DirectoryItemReader DirectoryItemReader()引发IOException{
返回新的DirectoryItemReader(“文件:/media/media/Music/***.flac”);
}
}
让我不得不为文件创建自定义读取器的部分。如果有人遇到这件事,我就是这样做的。我相信有更好的方法,但这对我来说很有效

public class DirectoryItemReader implements ItemReader<File>, InitializingBean {
    private final String directoryPath;

    private final List<File> foundFiles = Collections.synchronizedList(new ArrayList<>());

    public DirectoryItemReader(final String directoryPath) {
        this.directoryPath = directoryPath;
    }

    @Override
    public File read() {
        if (!foundFiles.isEmpty()) {
            return foundFiles.remove(0);
        }

        synchronized (foundFiles) {
            final Iterator files = foundFiles.iterator();

            if (files.hasNext()) {
                return foundFiles.remove(0);
            }
        }

        return null;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        for (final Resource file : getFiles()) {
            this.foundFiles.add(file.getFile());
        }
    }

    private Resource[] getFiles() throws IOException {
        ResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
        return patternResolver.getResources(directoryPath);
    }
}
公共类DirectoryItemReader实现ItemReader,初始化bean{ 私有最终字符串directoryPath; private final List foundFiles=Collections.synchronizedList(new ArrayList()); public DirectoryItemReader(最终字符串目录路径){ this.directoryPath=directoryPath; } @凌驾 公共文件读取(){ 如果(!foundFiles.isEmpty()){ 返回foundFiles。删除(0); } 已同步(查找文件){ final Iterator files=foundFiles.Iterator(); if(files.hasNext()){ 返回foundFiles。删除(0); } } 返回null; } @凌驾 public void afterPropertieSet()引发异常{ 对于(最终资源文件:getFiles()){ 这个.foundFiles.add(file.getFile()); } } 私有资源[]getFiles()引发IOException{ ResourcePatternResolver patternResolver=新路径匹配ResourcePatternResolver(); 返回patternsolver.getResources(directoryPath); } } 你唯一需要做的就是实现你自己的处理器。我在这个例子中使用了视频,所以我有一个视频处理器

@Slf4j
public class VideoItemProcessor implements ItemProcessor<File, Video> {

    @Override
    public Video process(final File item) throws Exception {
        Video video = Video.builder()
                .filename(item.getAbsoluteFile().getName())
                .absolutePath(item.getAbsolutePath())
                .fileSize(item.getTotalSpace())
                .build();

        log.info("Created {}", video);

        return video;
    }
}
@Slf4j
公共类VideoItemProcessor实现ItemProcessor{
@凌驾
公共视频进程(最终文件项)引发异常{
视频=Video.builder()
.filename(item.getAbsoluteFile().getName())
.absolutePath(项.getAbsolutePath())
.fileSize(item.getTotalSpace())
.build();
log.info(“创建{}”,视频);
返回视频;
}
}

如果是这样,FlatFileItemReader不适合您。在这种情况下,您需要类似DirectorReader的东西,它只返回文件(元数据)列表。然后在处理器中处理文件内容…这是一个很好的起点,我不知道应该使用哪个阅读器,谢谢。但是,我实际上找不到有关
DirectorReader
的任何信息?尝试一下,这并不能真正帮助解释如何处理文件列表。。。回到你说我不应该使用的东西,
FlatFileItemReader