如何获取类路径中目录中的所有文件

时间:2015-11-18 15:00:11

标签: spring-boot classpath embedded-resource

是否有办法使用ResourceLoader获取"子资源列表"在jar的目录中?

例如,给定来源

src/main/resources/mydir/myfile1.txt
src/main/resources/mydir/myfile2.txt

并使用

@Autowired
private ResourceLoader resourceLoader;

我可以到达目录

Resource dir = resourceLoader.getResource("classpath:mydir")
dir.exists() // true

但不是dir中的文件。如果我可以获取该文件,我可以拨打dir.getFile().listFiles(),但

dir.getFile() // explodes with FileNotFoundException

但是我无法找到一个方法来帮助孩子"资源。

2 个答案:

答案 0 :(得分:9)

您可以使用ResourcePatternResolver获取与特定模式匹配的所有资源。例如:

Resource[] resources = resourcePatternResolver.getResources("/mydir/*.txt")

您可以使用与ResourcePatternResolver相同的方式注入ResourceLoader

答案 1 :(得分:2)

基于Bohemian's注释和另一个answer,我使用以下内容获取目录和资源中子目录下所有YAML的输入流(请注意,传递的路径不会开始与/):

private static Stream<InputStream> getInputStreamsFromClasspath(
        String path,
        PathMatchingResourcePatternResolver resolver
) {
    try {
        return Arrays.stream(resolver.getResources("/" + path + "/**/*.yaml"))
                .filter(Resource::exists)
                .map(resource -> {
                    try {
                        return resource.getInputStream();
                    } catch (IOException e) {
                        return null;
                    }
                })
                .filter(Objects::nonNull);
    } catch (IOException e) {
        logger.error("Failed to get definitions from directory {}", path, e);
        return Stream.of();
    }
}