是否有办法使用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
但是我无法找到一个方法来帮助孩子"资源。
答案 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();
}
}