指定されたクラスパス ディレクトリからすべてのリソース名のリストを取得する方法 (メソッドのようなもの) を探しています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
s、 sを使って簡単なスニペットを書けることはわかっていますURL
が、車輪の再発明はしたくありません。質問は、公開されている既存のライブラリがある場合、 を実装する最も簡単な方法は何ですかgetResourceNames
? Spring と Apache Commons スタックはどちらも実行可能です。
ベストアンサー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 Framework から。
ロンマモの反射
他の手法は、CLASSPATH値が大きい場合、実行時に遅くなる可能性があります。より高速な解決策は、ronmamoのリフレクションAPIコンパイル時に検索をプリコンパイルします。