如果你可以确定你的 zip 文件永远不会被打包在另一个 jar 中,你可以使用类似的东西:
URL zipUrl = Main.class.getResource("/resources/zipfile.zip");
URL entryUrl = new URL("jar:" + zipUrl + "!/test.txt");
InputStream is = entryUrl.openStream();
或者:
URL zipUrl = Main.class.getResource("/resources/zipfile.zip");
File zipFile = new File(zipUrl.toURI());
ZipFile zip = new ZipFile(zipFile);
InputStream is = zip.getInputStream(zip.getEntry("test.txt"));
否则,您的选择是:
- 对于需要加载的每个条目,使用 ZipInputStream 扫描 zip 文件一次。如果您有很多资源,这可能会很慢,除非您可以为所有资源重用相同的 ZipInputStream。
- 不要将资源打包在嵌套的 zip 文件中,只需将它们与代码一起内联到 jar 中。
- 将嵌套的 zip 文件复制到临时目录中,并使用 ZipFile 类访问它。