java - ZipInputStream 和 JarInputStream 的 ZipEntry 大小不一致

标签 java jar applet zip signed-applet

我在一个 zip 文件中有一堆图像文件,我正在使用 ZipInputStream 读取这些文件并从 Applet 迭代 ZipEntry。

   ZipInputStream zis = new ZipInputStream(in);
        ZipEntry ze = null;
        while ((ze = zis.getNextEntry()) != null) {
            htSizes.put(ze.getName(), new Integer((int) ze.getSize()));
            if (ze.isDirectory()) {
                continue;
            }
            int size = (int) ze.getSize();
            // -1 means unknown size.
            if (size == -1) {
                size = ((Integer) htSizes.get(ze.getName())).intValue();
            }
            byte[] b = new byte[(int) size];
            int rb = 0;
            int chunk = 0;
            while (((int) size - rb) > 0) {
                chunk = zis.read(b, rb, (int) size - rb);
                if (chunk == -1) {
                    break;
                }
                rb += chunk;
            }
            // add to internal resource hashtable
            htJarContents.put(ze.getName(), b);
        }

然而,当我将这些图像放入一个签名的 jar 中时,“ze.getSize()” 的结果为 -1,并且图像文件读取不正确。

有人可以在这方面帮助我吗。

最佳答案

是的,-1 表示大小未知 - 虽然不清楚为什么要将它放入 map 然后再次取出它..

基本上,如果大小未知,您应该继续读取缓冲区,直到 read 返回 -1。一种简单的方法是创建一个 ByteArrayOutputStream,并继续从 ZipEntry 复制到它 - 然后一旦您完成读取,只需从 获取字节数组字节数组输出流。它将处理任何必要的大小调整。

关于java - ZipInputStream 和 JarInputStream 的 ZipEntry 大小不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8972730/

相关文章:

java - 在 Java Applet 中捕获用户的声卡输出

java - 无法正确签署 jar 文件

java - Apache Storm - LocalCluster 停止日志记录,但 java 进程仍在运行

java - 需要对openfedlib.jar的 "SAML2Utils.class"进行修改

java - Spring 和 Hibernate 5. SessionFactory 始终为 null

java - 如何设置谷歌日历 Java 应用程序

java.lang.NoClassDefFoundError : java. awt.Point

java - 如何合并两个Jar文件

java - 温度转换方法输出Java

java - Eclipse错误: Could not find or load main class opencv