绕过4GB JAR限制

Nat*_*man 6 java offline image

我正在制作一个包含大量图像的离线数据库程序 - 足以使jar文件超过4GB,正如Netbeans告诉我的那样,这是不允许的.

我想知道在这个限制下获取文件的最佳方法是什么,以及如何编写方法来使用Java访问图像.图像文件夹本身目前是4.63GB,并且在将来的更新中会变得更大(可能是几MB).

你有什么建议,Stackoverflow?

icz*_*cza 11

您可以创建多个罐子.为什么它必须是一个罐子?

从Java 1.7.0 build 55开始,Java支持大于4GB的jar文件和zip文件,请参阅此文章:

ZIP64,> 4G Zipfile的格式,现在支持

你也可以压缩图像,使用不同的格式将它们压缩到更小的尺寸,所以它们总共小于4GB; 考虑像JPEG这样的有损压缩.如果它们已经被最大化压缩,那么您可以考虑减小它们的尺寸(例如500x250像素而不是1000x500).

编辑:

引用java.util.zip的javadoc :

实现可以选择性地支持PKWARE ZIP文件格式规范定义的ZIP64(tm)格式扩展.ZIP64(tm)格式扩展用于克服原始ZIP格式的大小限制.

所以看起来它是由Java实现决定它是否支持Zip64,它不是规范要求.第一个链接表明OpenJDK支持它.

此外,在上述版本(1.7.0 b55)之后,所有Oracle JDK都支持它.Netbeans可能会拒绝创建大于4 GB的jar,如果它是旧版本,或者因为它希望保持与旧JVM的兼容性.

如何判断您的Java是否支持它?

对于Oracle JRE/JDK:查找JRE/JDK的rt.jar(runtime.jar)文件.打开它(它是一个zip文件)并进入该java/util/zip文件夹.如果它有一个ZipConstants64.class文件,那么它支持Zip64.

从Java代码:尝试获取Class上述类的对象.如果成功,您的Oracle JRE/JDK支持它:

System.out.println("Java version: " + System.getProperty("java.version"));
System.out.println("Java vendor: " + System.getProperty("java.vendor"));
try {
    Class.forName("java.util.zip.ZipConstants64");
    System.out.println("Your Java supports Zip64 :)");
} catch (ClassNotFoundException e) {
    System.out.println("Your Java doesn't support Zip64 :(");
}
Run Code Online (Sandbox Code Playgroud)

输出:

Java version: 1.8.0_20
Java vendor: Oracle Corporation
Your Java supports Zip64 :)
Run Code Online (Sandbox Code Playgroud)