我遇到了同样的问题。我有一个 java.util.zip.ZipFile 无法处理的 zip 存档,但 WinRar 将其解压缩得很好。我在 SDN 上找到了关于 Java 中压缩和解压缩选项的文章。我稍微修改了一个示例代码以生成最终能够处理存档的方法。技巧在于使用 ZipInputStream 而不是 ZipFile 并按顺序读取 zip 存档。此方法还能够处理空的 zip 存档。我相信您可以调整该方法以满足您的需要,因为所有 zip 类都有 .jar 档案的等效子类。
public void unzipFileIntoDirectory(File archive, File destinationDir)
throws Exception {
final int BUFFER_SIZE = 1024;
BufferedOutputStream dest = null;
FileInputStream fis = new FileInputStream(archive);
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
File destFile;
while ((entry = zis.getNextEntry()) != null) {
destFile = FilesystemUtils.combineFileNames(destinationDir, entry.getName());
if (entry.isDirectory()) {
destFile.mkdirs();
continue;
} else {
int count;
byte data[] = new byte[BUFFER_SIZE];
destFile.getParentFile().mkdirs();
FileOutputStream fos = new FileOutputStream(destFile);
dest = new BufferedOutputStream(fos, BUFFER_SIZE);
while ((count = zis.read(data, 0, BUFFER_SIZE)) != -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
fos.close();
}
}
zis.close();
fis.close();
}