我的项目结构如下:
Myproject
|--package1
| |--class1
|--package2
| |--class2
|--rsc
| |--images
| |--image1
|--image2
我的问题是在将此项目导出为.jar后,将所有文件(images1& images2)放在images目录中。
在研究问题后,我发现我可以在部署后使用它来访问资源:
this.getClass().getClassLoader().getResource(path);
但是使用这种方法,我只能获取资源,而不是该文件夹中的所有文件。
这就是我试图做的事情:
File[] files = new File(this.getClass().getClassLoader().getResource("images").getFile()).listFiles();
它在Eclipse中有效,但当我将项目导出为.jar时它不起作用。
有没有解决方案?
答案 0 :(得分:1)
可以遍历jar文件中的文件夹内容。然而,这样做非常痛苦。
看一下JarFile课程。您可以使用entries()
方法获取Jar的所有条目,然后仅查看以"images/"
开头的条目来过滤它们。
这样的事情:
// this is a lengthy work around to figure out the path of the jar file that
// this application was started from
File pathToJar = new File(Util.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
JarFile jarFile = new JarFile(pathToJar);
java.util.Enumeration enumEntries = jarFile.entries();
while (enumEntries.hasMoreElements()) {
java.util.jar.JarEntry file = (java.util.jar.JarEntry) enumEntries.nextElement();
if(!file.getName().contains("images/")) {
continue;
}
// do something with that JarEntry
}
虽然在Eclipse中运行应用程序时这不起作用(因为没有JarFile可供扫描) 您需要在代码中进行区分,以正常方式遍历目录,或者使用Jar文件,这取决于您启动应用程序的方式。
如果这太丑陋和/或太多工作,您可能还应该考虑将该资源文件夹放在实际文件系统上的jar之外。
然后您可以像访问任何其他目录一样访问它:
File[] files = new File("./rsc/images/").listFiles();
您只需确保在部署中包含该文件夹或以其他方式分发应用程序。