java - 从类路径目录获取资源列表

标签 java resources classpath

我正在寻找一种方法来从给定的类路径目录中获取所有资源名称的列表,类似于方法 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,JarFileURL 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/

相关文章:

java - 从 Java 调用 .NET Web 服务(WSE 2/3,WS-Security)

java - 在 Quarkus 中使用 ResourceLoader

html - 如何通过脚本标签将数据(csv 文件或类似文件)加载到页面中?

database - 添加数据库驱动程序以使用 WEKA 类

java - java中如何将int转换为十六进制颜色格式

java - "org.hibernate.DuplicateMappingException"错误是什么意思?

java - 带有标题和 toast 的 ListActivity 选择了错误的列表项

c# - 资源文件转换问题

java - Eclipse 看不到 CLASSPATH

java - 在 Eclipse 中设置不同的 Java 类路径