ZipInputStream.getNextEntry 在某些 zip 文件上返回 null
我有一个简单的代码来提取zip文件,它工作得很好,在我的测试期间,我尝试了一些zip文件(字体,图标和我从互联网下载的模板)的代码,只是为了确保它应该提取提供的任何zip文件,但它不适用于一些zip文件,这是最小化的代码来重新生成这个问题:
package com.test.mytest;
import java.io.FileInputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
public class ZipExtractTest {
    public static final String ZIP_FILE = "/Users/XXXXX/Downloads/janne.zip";
    public static void main(String[]args) {
        unzipFile(ZIP_FILE);
        unzipStream(ZIP_FILE);
    }
    public static void unzipFile(String zipName) {
        try {
            ZipFile zf = new ZipFile(zipName);
            Enumeration ent = zf.entries();
            while(ent.hasMoreElements()) {
                System.out.println(ent.nextElement());
            }
        } catch(Exception e) {
            System.out.println(e);
        }
    }
    public static void unzipStream(String zipName) {
        try {
            ZipInputStream zis = new ZipInputStream(new FileInputStream(zipName));
            ZipEntry ze = zis.getNextEntry();
            if(ze == null) {
                System.out.println("unable to get first entry from zip file");
                zis.close();
                return;
            }
            while(ze != null) {
                System.out.println("Entry Found: " + ze);
                ze = zis.getNextEntry();
            }
            zis.closeEntry();
            zis.close();
        } catch(Exception e) {
            System.out.println(e);
        }
    }
}
实际上,在我的实际应用程序中,我必须通过输入流提取zip文件。在上面的代码中,我试图提取“janne.zip”,我从 http://www.iconian.com/fonts/janne.zip 下载了这个文件,我能够使用任何zip工具提取它,令人惊讶的是通过“unzipFile(String zipName)”方法,但使用unzipStream(String zipName)方法
ZipEntry ze = zis.getNextEntry();
返回空值
任何帮助将不胜感激