小编典典

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

all

我正在寻找一种从给定类路径目录中获取所有资源名称列表的方法,例如 method List<String> getResourceNames (String directoryName)

例如,给定一个x/y/z包含 files a.html、和子目录的类路径目录,b.html应该返回包含以下字符串的
a:。c.html``d``getResourceNames("x/y/z")``List<String>``['a.html', 'b.html', 'c.html', 'd']

它应该适用于文件系统和 jar 中的资源。

我知道我可以用Files、JarFiles 和URLs
编写一个快速片段,但我不想重新发明轮子。我的问题是,鉴于现有的公开可用的图书馆,最快的实施方式是getResourceNames什么?Spring 和
Apache Commons 堆栈都是可行的。


阅读 72

收藏
2022-04-21

共1个答案

小编典典

自定义扫描仪

实现您自己的扫描仪。例如:

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();
}

春天框架

PathMatchingResourcePatternResolver
Spring 框架中使用。

龙马毛思考

对于巨大的 CLASSPATH 值,其他技术在运行时可能会很慢。更快的解决方案是使用 ronmamo 的Reflections
API
,它在编译时预编译搜索。

2022-04-21