我正在寻找一种方法来从给定的类路径目录中获取所有资源名称的列表,类似于方法 List<String> getResourceNames (String directoryName)
.
例如,给定一个类路径目录 x/y/z
包含文件a.html
, b.html
, c.html
和一个子目录 d
, getResourceNames("x/y/z")
应该返回 List<String>
包含以下字符串:['a.html', 'b.html', 'c.html', 'd']
.
它应该适用于文件系统和 jar 中的资源。
我知道我可以使用 File
编写一个快速片段s,JarFile
和 URL
s,但我不想重新发明轮子。我的问题是,考虑到现有的公开可用的库,实现 getResourceNames
的最快方法是什么? ? Spring 和 Apache Commons 堆栈都是可行的。
最佳答案
自定义扫描仪
实现您自己的扫描仪。例如:
( limitations of this solution are mentioned in the comments )
private List<String> getResourceFiles(String path) throws IOException {
List<String> filenames = new ArrayList<>();
try (
InputStream in = getResourceAsStream(path);
BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
String resource;
while ((resource = br.readLine()) != null) {
filenames.add(resource);
}
}
return filenames;
}
private InputStream getResourceAsStream(String resource) {
final InputStream in
= getContextClassLoader().getResourceAsStream(resource);
return in == null ? getClass().getResourceAsStream(resource) : in;
}
private ClassLoader getContextClassLoader() {
return Thread.currentThread().getContextClassLoader();
}
Spring框架
使用PathMatchingResourcePatternResolver
来自 Spring 框架。
Ronmamo 思考
对于巨大的 CLASSPATH 值,其他技术在运行时可能会很慢。更快的解决方案是使用 ronmamo 的 Reflections API ,它在编译时预编译搜索。
关于java - 从类路径目录获取资源列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61680489/