我正在尝试编写一个 Java 类来提取一个包含 ~74000 个 XML 文件的大型 zip 文件。尝试使用 java zip 库解压缩时出现以下异常:
java.util.zip.ZipException : ZIP 文件中的条目太多
不幸的是,由于项目的要求,我无法在它到达我之前将其分解,并且解压缩过程必须是自动化的(没有手动步骤)。有没有办法利用 java.util.zip 或使用一些 3rd 方 Java zip 库来解决这个限制?
谢谢。
我正在尝试编写一个 Java 类来提取一个包含 ~74000 个 XML 文件的大型 zip 文件。尝试使用 java zip 库解压缩时出现以下异常:
java.util.zip.ZipException : ZIP 文件中的条目太多
不幸的是,由于项目的要求,我无法在它到达我之前将其分解,并且解压缩过程必须是自动化的(没有手动步骤)。有没有办法利用 java.util.zip 或使用一些 3rd 方 Java zip 库来解决这个限制?
谢谢。
使用ZipInputStream
而不是ZipFile
应该这样做。
使用 apache IOUtils:
FileInputStream fin = new FileInputStream(zip);
ZipInputStream zin = new ZipInputStream(fin);
ZipEntry ze = null;
while ((ze = zin.getNextEntry()) != null) {
FileOutputStream fout = new FileOutputStream(new File(
outputDirectory, ze.getName()));
IOUtils.copy(zin, fout);
IOUtils.closeQuietly(fout);
zin.closeEntry();
}
IOUtils.closeQuietly(zin);
Zip 标准在一个文件中最多支持 65536 个条目。除非 Java 库支持 ZIP64 扩展,否则如果您尝试读取或写入包含 74,000 个条目的存档,它将无法正常工作。
我重新设计了该方法以更方便地处理目录结构并一次压缩一大堆目标。纯文件将添加到 zip 文件的根目录,如果您传递目录,则将保留底层结构。
def zip (String zipFile, String [] filesToZip){
def result = new ZipOutputStream(new FileOutputStream(zipFile))
result.withStream { zipOutStream ->
filesToZip.each {fileToZip ->
ftz = new File(fileToZip)
if(ftz.isDirectory()){
pathlength = new File(ftz.absolutePath).parentFile.absolutePath.size()
ftz.eachFileRecurse {f ->
if(!f.isDirectory()) writeZipEntry(f, zipOutStream, f.absolutePath[pathlength..-1])
}
}
else writeZipEntry(ftz, zipOutStream, '')
}
}
}
def writeZipEntry(File plainFile, ZipOutputStream zipOutStream, String path) {
zipOutStream.putNextEntry(new ZipEntry(path+plainFile.name))
new FileInputStream(plainFile).withStream { inStream ->
def buffer = new byte[1024]
def count
while((count = inStream.read(buffer, 0, 1024)) != -1)
zipOutStream.write(buffer)
}
zipOutStream.closeEntry()
}