Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有可以修复文件的JavaZIP库&xE0;拉齐夫?_Java_Zip - Fatal编程技术网

是否有可以修复文件的JavaZIP库&xE0;拉齐夫?

是否有可以修复文件的JavaZIP库&xE0;拉齐夫?,java,zip,Java,Zip,我偶尔会在我的应用程序中收到.zip文件,这些文件会抛出未找到的中心目录的start; zipfile已损坏。异常。这些zip文件在我的Mac Finder中打开得很好 我每次都可以从命令行修复这些文件,使用zip-FF bad.zip--out good.zip 任何Java ZIP库都能完成同样的任务吗?您可能希望让Java执行这个命令,因为严格来说,ZIP更像一个容器,它可以包含不同的压缩算法 一般来说,用程序化的方法调查和解决与压缩档案相关的问题可能是一项棘手而漫长的任务 使用您的命令。

我偶尔会在我的应用程序中收到.zip文件,这些文件会抛出未找到的中心目录的
start;
zipfile已损坏。
异常。这些zip文件在我的Mac Finder中打开得很好

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


任何Java ZIP库都能完成同样的任务吗?

您可能希望让Java执行这个命令,因为严格来说,ZIP更像一个容器,它可以包含不同的压缩算法

一般来说,用程序化的方法调查和解决与压缩档案相关的问题可能是一项棘手而漫长的任务


使用您的命令。

有两种方法可以在Java中打开ZIP文件,使用类或使用

就我所记得的,
ZipFile
首先读取zip文件的中心目录-它可以这样做,因为它在下面使用了一个
RandomAccessFile
。但是,
ZipInputStream
使用了行内条目信息,如果文件末尾的中心目录丢失或损坏,这可能会更好


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

我尝试使用ZipInputStream和ZipOutStream。但是ZipInputStream在执行“getNextEntry()”时总是在某个点失败。基本上,“getNextEntry()”中的以下代码行:

在一些条目之后返回null,我无法进一步获取

但最后,我可以使用ZipFile和ZipOutStream解决这个问题,因为ZipFile读取所有zip条目没有问题,解决方案如下所示:

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);
}
protectedvoid repairZipFile(字符串文件)引发IOException{
文件修复ZipFile=新文件(文件+“.repair”);
ZipFile ZipFile=新ZipFile(文件);

Enumeration7 zip可能在这里很有用。我最初也这么认为,但该命令可能不适用于所有操作系统。他只使用了1个特定的操作系统,其他选项是处理所有可能的算法、实现和zip容器的规格,或者使用一个好的SDK压缩归档。
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);
}