是否有一个Java压缩档案库,可以解决文件,点菜的zip -FF?(Is there a Java

2019-11-01 05:12发布

我偶尔会收到.zip文件在我的应用程序抛出的文件start of central directory not found; zipfile corrupt. start of central directory not found; zipfile corrupt. 例外。 这些zip文件打开我的Mac的Finder就好了。

在命令行,每次我可以修复这些文件,使用zip -FF bad.zip --out good.zip

任何Java ZIP库都可以在那里完成同样的事情?

Answer 1:

你可能只想让Java的执行这个命令,因为在严格的条件拉链更像是一个容器,它可以包含不同的压缩算法。

在涉及到压缩归档用一种编程方法一般调查和解决问题,它很可能是一个棘手的和长期任务。

试试这个与你的命令。



Answer 2:

有两种方法在Java中打开ZIP文件,使用的ZipFile类,或使用ZipInputStream 。

至于我记得, ZipFile首先读取压缩文件的中央目录-它可以做到这一点,因为它使用RandomAccessFile下方。 然而, ZipInputStream使用在线条目信息,如果中央目录,我认为存在于文件的末尾,丢失或损坏,这可能是更好的。

因此,它可能通过阅读使用ZipInputStream一个ZIP文件,并写回该用在一个ZipOutputStream另一个文件,将它们复制之间的条目的信息是可能的“修复” Java中的ZIP文件。 你可能最终得到IO异常从ZipInputStream的最后一个条目读,如果它得到了截断,但它可能仍然保存该文件中的其他以前的条目。



Answer 3:

我尝试使用ZipInputStream和ZipOutputStream。 但是ZipInputStream做的时候总是失败在某些时候:“getNextEntry()”。 在的代码基本上以下行“getNextEntry()”:

...
    if ((entry = readLOC()) == null) {
        return null;
    }
...

某些条目后返回null,我不能再获得。

但最后我能解决使用的ZipFile与ZipOutputStream在一起,因为ZipFile中读到的所有拉链条目没有问题和解决方案看起来像这样的问题:

protected void repairZipFile(String file) throws IOException {
    File repairZipFile = new File(file+".repair");
    ZipFile zipFile = new ZipFile(file);
    Enumeration<? extends ZipEntry> zipFileEntries = zipFile.entries();
    InputStream zis;
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(repairZipFile));
    byte[] b = new byte[1024];
    while(zipFileEntries.hasMoreElements()){
        ZipEntry zipEntry = zipFileEntries.nextElement();
        zos.putNextEntry(zipEntry);
        zis = zipFile.getInputStream(zipEntry);
        int n = zis.read(b);
        while(n>=0) {
            zos.write(b, 0, n);
            n = zis.read(b);
        }
        zis.close();
        zos.closeEntry();
    }
    zipFile.close();
    zos.flush();
    zos.close();
    Files.move(repairZipFile.toPath(), (new File(file)).toPath(), StandardCopyOption.REPLACE_EXISTING);
}


文章来源: Is there a Java zip library that can fix files, à la zip -FF?
标签: java zip