如何从JAR文件中获取资源“文件夹”?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我在我的项目根目录中有一个资源文件夹/包,我“不”想要加载某个文件。如果我想加载某个文件,我将使用class.getResourceAsStream,这会很好!!我真正想要做的是在资源文件夹中加载一个“文件夹”,在该文件夹中循环文件,并获取一个流到每个文件并读取内容。假设文件名在运行时之前没有确定。我该怎么办?是否有方法获取JAR文件中文件夹中的文件列表?注意,带有资源的Jar文件是运行代码的同一个JAR文件

提问于
用户回答回答于

最后,我找到了解决方案:

final String path = "sample/folder";
final File jarFile = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath());

if(jarFile.isFile()) {  // Run with JAR file
    final JarFile jar = new JarFile(jarFile);
    final Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
    while(entries.hasMoreElements()) {
        final String name = entries.nextElement().getName();
        if (name.startsWith(path + "/")) { //filter according to the path
            System.out.println(name);
        }
    }
    jar.close();
} else { // Run with IDE
    final URL url = Launcher.class.getResource("/" + path);
    if (url != null) {
        try {
            final File apps = new File(url.toURI());
            for (File app : apps.listFiles()) {
                System.out.println(app);
            }
        } catch (URISyntaxException ex) {
            // never happens
        }
    }
}

第二个块在IDE上运行应用程序(而不是使用JAR文件)时工作,如果不喜欢,可以删除它。

用户回答回答于

试试下面的方法。

创建资源路径"<PathRelativeToThisClassFile>/<ResourceDirectory>"例如,如果你的类路径是com.abc.Package.MyClass,并且你的资源文件位于src/com/abc/Package/resources/:

URL url = MyClass.class.getResource("resources/");
if (url == null) {
     // error - missing folder
} else {
    File dir = new File(url.toURI());
    for (File nextFile : dir.listFiles()) {
        // Do something with nextFile
    }
}

你也可以使用

URL url = MyClass.class.getResource("/com/abc/package/resources/");

扫码关注云+社区