如何正确使用ClassLoader.getResources()?

时间:2011-03-04 12:36:53

标签: java resources classpath classloader getresource

如何使用ClassLoader.getResources()从类路径中查找recursivly资源?

E.g。

  • 查找META-INF“目录中的所有资源”: 想象一下像

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

    不幸的是,这只会将URL检索到这个“目录”。

  • 所有名为bla.xml的资源(recursivly)

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

    但是这会返回一个空的Enumeration

作为奖励问题:ClassLoader.getResources()ClassLoader.getResource()的区别如何?

5 个答案:

答案 0 :(得分:34)

Spring Framework有一个允许递归搜索类路径的类:

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
resolver.getResources("classpath*:some/package/name/**/*.xml");

答案 1 :(得分:19)

无法以递归方式搜索类路径。您需要知道资源的完整路径名才能以这种方式检索它。资源可能位于文件系统的目录中或jar文件中,因此它不像执行“类路径”的目录列表那么简单。您需要提供资源的完整路径,例如'/com/mypath/bla.xml'。

对于第二个问题,getResource将返回与给定资源名称匹配的第一个资源。搜索类路径的顺序在the javadoc for getResource.

中给出

答案 2 :(得分:19)

这是获取某个URL对象指向的File对象的最简单的wat:

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

现在,针对您的具体问题:

  
      
  • 查找META-INF“目录”中的所有资源:
  •   

您确实可以将File对象指向此URL

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的资源   (recursivly)
  •   

在这种情况下,您必须执行一些自定义代码。这是一个虚拟的例子:

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列表中获得所有找到的事件。

答案 3 :(得分:9)

以下是基于bestsss答案的代码:

    Enumeration<URL> en = getClass().getClassLoader().getResources(
            "META-INF");
    List<String> profiles = new ArrayList<>();
    if (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);
            }
        }
    }

答案 4 :(得分:5)

MRalwasser,我会给你一个提示,将URL.getConnection()投向JarURLConnection。 然后使用JarURLConnection.getJarFile()并瞧!你有JarFile,你可以自由访问里面的资源。

其余的我留给你。

希望这有帮助!