我偶尔会收到.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库都可以在那里完成同样的事情?
我偶尔会收到.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库都可以在那里完成同样的事情?
你可能只想让Java的执行这个命令,因为在严格的条件拉链更像是一个容器,它可以包含不同的压缩算法。
在涉及到压缩归档用一种编程方法一般调查和解决问题,它很可能是一个棘手的和长期任务。
试试这个与你的命令。
有两种方法在Java中打开ZIP文件,使用的ZipFile类,或使用ZipInputStream 。
至于我记得, ZipFile
首先读取压缩文件的中央目录-它可以做到这一点,因为它使用RandomAccessFile
下方。 然而, ZipInputStream
使用在线条目信息,如果中央目录,我认为存在于文件的末尾,丢失或损坏,这可能是更好的。
因此,它可能通过阅读使用ZipInputStream一个ZIP文件,并写回该用在一个ZipOutputStream另一个文件,将它们复制之间的条目的信息是可能的“修复” Java中的ZIP文件。 你可能最终得到IO异常从ZipInputStream的最后一个条目读,如果它得到了截断,但它可能仍然保存该文件中的其他以前的条目。
我尝试使用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);
}