绕过4GB JAR限制

时间:2014-11-27 20:08:44

标签: java image offline

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

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

你有什么建议,Stackoverflow?

1 个答案:

答案 0 :(得分:10)

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

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

ZIP64, The Format for > 4G Zipfile, Is Now Supported

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

修改

引用java.util.zip package的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 :(");
}

输出:

Java version: 1.8.0_20
Java vendor: Oracle Corporation
Your Java supports Zip64 :)