如何使用ClassLoader.getResources()
从我的类路径中找到递归资源?
例如。
META-INF
“目录”中的所有资源:getClass().getClassLoader().getResources("META-INF")
不幸的是,这只能检索到名为bla.xml
(递归地)的"directory".
URL
getClass().getClassLoader().getResources("bla.xml")
但是这将返回一个空的Enumeration
.
还有一个额外的问题:ClassLoader.getResources()
与ClassLoader.getResource()
有什么不同
发布于 2011-03-04 20:45:35
没有办法递归地搜索类路径。您需要知道资源的完整路径名才能以这种方式检索它。资源可能在文件系统中的目录中,也可能在jar文件中,因此它不像执行“类路径”的目录列表那么简单。您需要提供资源的完整路径,例如'/com/mypath/bla.xml‘。
对于您的第二个问题,getResource将返回与给定资源名称匹配的第一个资源。在the javadoc for getResource.中给出了搜索类路径的顺序
发布于 2013-06-25 03:41:17
Spring Framework有一个类,它允许递归地搜索类路径:
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
resolver.getResources("classpath*:some/package/name/**/*.xml");
发布于 2011-03-04 21:03:55
这是获取某个URL对象所指向的File对象的最简单的方法:
File file=new File(url.toURI());
现在,对于你的具体问题:
您确实可以获取指向此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();
}
命名为(recursivly) (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
列表中获得所有找到的词条。
https://stackoverflow.com/questions/5193786
复制相似问题