91

ClassLoader.getResources()クラスパスから再帰的にリソースを見つけるにはどうすればよいですか?

例えば

  • META-INF「ディレクトリ」内のすべてのリソースを見つける: 次のようなものを想像してください

    getClass().getClassLoader().getResources("META-INF")

    残念ながら、これはURLまさにこの「ディレクトリ」までしか取得しません。

  • bla.xml(再帰的に)名前が付けられたすべてのリソース

    getClass().getClassLoader().getResources("bla.xml")

    しかし、これは空の を返しますEnumeration

おまけの質問として: は とどうClassLoader.getResources()違うのClassLoader.getResource()ですか?

4

5 に答える 5

25

クラスパスを再帰的に検索する方法はありません。この方法でリソースを取得できるようにするには、リソースのフルパス名を知っている必要があります。リソースはファイルシステムまたはjarファイルのディレクトリにある可能性があるため、「クラスパス」のディレクトリリストを実行するほど簡単ではありません。リソースのフルパス(例:'/com/mypath/bla.xml')を指定する必要があります。

2番目の質問では、getResourceは指定されたリソース名に一致する最初のリソースを返します。クラスパスが検索される順序は、getResourceのjavadocに記載されています。

于 2011-03-04T12:45:34.807 に答える
22

これは、特定の URL オブジェクトが指している File オブジェクトを取得する最も簡単な方法です。

File file=new File(url.toURI());

さて、あなたの具体的な質問について:

  • META-INF「ディレクトリ」内のすべてのリソースを見つける:

実際に、この URL を指す File オブジェクトを取得できます。

Enumeration<URL> en=getClass().getClassLoader().getResources("META-INF");
if (en.hasMoreElements()) {
    URL metaInf=en.nextElement();
    File fileMetaInf=new File(metaInf.toURI());

    File[] files=fileMetaInf.listFiles();
    //or 
    String[] filenames=fileMetaInf.list();
}
  • bla.xml という名前のすべてのリソース (再帰的に)

この場合、いくつかのカスタム コードを実行する必要があります。ダミーの例を次に示します。

final List<File> foundFiles=new ArrayList<File>();

FileFilter customFilter=new FileFilter() {
    @Override
    public boolean accept(File pathname) {

        if(pathname.isDirectory()) {
            pathname.listFiles(this);
        }
        if(pathname.getName().endsWith("bla.xml")) {
            foundFiles.add(pathname);
            return true;
        }
        return false;
    }

};      
//rootFolder here represents a File Object pointing the root forlder of your search 
rootFolder.listFiles(customFilter);

コードを実行すると、見つかったすべてのオカレンスがfoundFilesリストに表示されます。

于 2011-03-04T13:03:54.787 に答える
12

bestsss の回答に基づくコードは次のとおりです。

    Enumeration<URL> en = getClass().getClassLoader().getResources(
            "META-INF");
    List<String> profiles = new ArrayList<>();
    while (en.hasMoreElements()) {
        URL url = en.nextElement();
        JarURLConnection urlcon = (JarURLConnection) (url.openConnection());
        try (JarFile jar = urlcon.getJarFile();) {
            Enumeration<JarEntry> entries = jar.entries();
            while (entries.hasMoreElements()) {
                String entry = entries.nextElement().getName();
                System.out.println(entry);
            }
        }
    }
于 2013-03-11T05:43:48.203 に答える
5

MRalwasser さん、ヒントを教えてURL.getConnection()くださいJarURLConnection。次に、JarURLConnection.getJarFile() と出来上がりを使用します。JarFile があり、内部のリソースに自由にアクセスできます。

残りはあなたに任せます。

お役に立てれば!

于 2011-03-04T12:57:33.500 に答える