从 Spring Boot 的 Fat JAR 中读取目录

Read directory from Spring Boot's Fat JAR

我正在尝试读取 Spring Boot 2 应用程序中的 resources/configs 目录。这是目录结构的示例:

resources
| configs
| | file1.xml
| | file2.xml
| | ...

我正在读取目录和嵌套文件的代码:

@Value("${app.configs-path}")
String configsPath;

...

Resource configsDirectoryResource = new ClassPathResource(configsPath);
InputStream configsDirectoryStream = configsDirectoryResource.getInputStream();
InputStreamReader configsDirectoryStreamReader = new InputStreamReader(configsDirectoryStream);
BufferedReader configsDirectoryBufferedReader = new BufferedReader(configsDirectoryStreamReader);

List<String> configFileNames = configsDirectoryBufferedReader.lines().collect(toList());

还有我的application.properties

app.configs-path=configs

当我 运行 我的应用程序在 IDE 时,这工作正常。对象 configsDirectoryResource returns 文件名流,然后我读取每个嵌套文件。但是当我启动 JAR 文件时,configsDirectoryResource returns 没有文件名。但是我可以直接读取 XML 个文件,但我想在 运行 时间内获取文件列表。

如何读取 JAR 文件中的目录或获取目录中的文件列表?

您可以使用 Spring 框架中的 PathMatchingResourcePatternResolver

示例代码:

ClassLoader cl = this.getClass().getClassLoader();
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
Resource[] resources = resolver.getResources("classpath*:/"+configsPath+"/*.xml") ;
for (Resource resource: resources){
    logger.info(resource.getFilename());
}

好的,这比我想象的要容易。

ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resourcePatternResolver.getResources(configsPath + "/*.xml");

然后我们可以从每个 resource 中得到一个 InputStream 并使用它们。