1. ホーム

[解決済み】クラスパス・ディレクトリからリソースのリストを取得する

2022-03-30 11:11:01

質問

与えられたクラスパス・ディレクトリからすべてのリソース名のリストを取得する方法を探しています。 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 しかし、私は車輪の再発明をしたくありません。私の質問は、既存の一般に利用可能なライブラリがある場合、次のような実装を行う最も手っ取り早い方法は何かということです。 getResourceNames ? SpringとApache Commonsのスタックはどちらも実現可能です。

どのように解決するのか?

カスタムスキャナ

独自のスキャナを実装します。例えば

( このソリューションの制限については、コメントで触れています。 )

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 Frameworkから取得します。

ロンマモの振り返り

他の手法では、CLASSPATHの値が巨大な場合、実行時に遅くなる可能性があります。より高速な解決策は、ronmamoの リフレクションズAPI これは、コンパイル時に検索をプリコンパイルするものです。