MRa*_*ser 78 java resources classpath classloader getresource
如何使用ClassLoader.getResources()
从类路径中查找recursivly资源?
例如
找到META-INF
"目录" 中的所有资源:想象一下
getClass().getClassLoader().getResources("META-INF")
不幸的是,这只会检索URL
到这个"目录".
所有资源命名bla.xml
(recursivly)
getClass().getClassLoader().getResources("bla.xml")
但是这会返回一个空的Enumeration
.
并作为一个奖金问题:如何ClassLoader.getResources()
区别ClassLoader.getResource()
?
rec*_*rec 35
Spring Framework有一个类,允许递归搜索类路径:
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
resolver.getResources("classpath*:some/package/name/**/*.xml");
Run Code Online (Sandbox Code Playgroud)
kro*_*ock 20
无法以递归方式搜索类路径.您需要知道资源的完整路径名才能以这种方式检索它.资源可能位于文件系统的目录中或jar文件中,因此它不像执行"类路径"的目录列表那么简单.您需要提供资源的完整路径,例如'/com/mypath/bla.xml'.
对于第二个问题,getResource将返回与给定资源名称匹配的第一个资源.搜索类路径的顺序在getResource的javadoc中给出.
Tom*_*ros 19
这是获取某个URL对象指向的File对象的最简单的wat:
File file=new File(url.toURI());
Run Code Online (Sandbox Code Playgroud)
现在,针对您的具体问题:
- 查找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();
}
Run Code Online (Sandbox Code Playgroud)
- 所有名为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);
Run Code Online (Sandbox Code Playgroud)
运行代码时,您将在foundFiles
List中获得所有找到的事件.
这是基于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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
MRalwasser,我会给你一个提示,施放URL.getConnection()
到JarURLConnection
.然后使用JarURLConnection.getJarFile()并瞧!你有JarFile,你可以自由访问里面的资源.
其余的我留给你.
希望这可以帮助!
归档时间: |
|
查看次数: |
188290 次 |
最近记录: |