为什么我的程序在 java.util.zip 解压缩时会跳过文件?

Why does my program skip files when unzipping by java.util.zip?

看了好几篇文章,都没有找到类似的问题和解决办法。

我尝试读取所有文件并使用方法跳过了一些 zis.getNextEntry

        public static void main(String[] args) throws Exception {
            String fileZip = "src/main/resources/unzipTest/fias_xml.zip";
            ZipInputStream zis = new ZipInputStream(new FileInputStream(fileZip));
            ZipEntry entry;
            while ((entry = zis.getNextEntry()) != null) {
                System.out.println(entry.getName());
            }
        }
}

但是如果你用 WinRar 解压,一切都会被正确解压

Archive files

After running the program

或者我怎么知道为什么有些文件无法读取?

存档能破解吗?

我用winrar解压和重新压缩文件后,程序运行正常。为什么 winrar 可以做到这一点,但 java 代码却不能?

zipArchive

jdk1.8.0_161

根据测试,我能够正确打印每个目录和文件名。

我想到了两种情况: i) 文件名长度或完整长度更多是平台可以处理的。但这也应该是从 winrar 解压缩时的情况 ii) 是否有任何权限问题,但同样不会是选择性的方式。

你能告诉我哪个 jdk 版本吗?

能不能把zip文件发给我,我试试模拟一下。

public void unzip(String zipFile, String destDir)
    {
        try
        {
            int BUFFER = 8*1024;
            File file = new File(zipFile);
            ZipFile zip = new ZipFile(file);
            String newPath = destDir;
            new File(newPath).mkdir();
            Enumeration zipFileEntries = zip.entries();
            while (zipFileEntries.hasMoreElements())
            {
                ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
                String currentEntry = entry.getName();
                File destFile = new File(newPath, currentEntry);
                File destinationParent = destFile.getParentFile();
                destinationParent.mkdirs();

                if (!entry.isDirectory())
                {
                    BufferedInputStream is = new BufferedInputStream(zip
                            .getInputStream(entry));
                    int currentByte;
                    byte[] data = new byte[BUFFER];
                    FileOutputStream fos = new FileOutputStream(destFile);
                    BufferedOutputStream dest = new BufferedOutputStream(fos,
                            BUFFER);
                    while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
                        dest.write(data, 0, currentByte);
                    }
                    dest.flush();
                    dest.close();
                    is.close();
                }
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }