7

~74000 の XML ファイルを含む大きな zip ファイルを抽出する Java クラスを作成しようとしています。Java zip ライブラリを使用して解凍しようとすると、次の例外が発生します。

java.util.zip.ZipException : ZIP ファイル内のエントリが多すぎます

残念ながら、プロジェクトの要件により、私に届く前に zip を分解することができず、解凍プロセスを自動化する必要があります (手動の手順はありません)。java.util.zip またはサードパーティの Java zip ライブラリを使用して、この制限を回避する方法はありますか?

ありがとう。

4

4 に答える 4

7

ZipInputStreamの代わりに使用すると、ZipFileおそらくそれを行う必要があります。

于 2009-01-27T15:35:22.010 に答える
3

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);
于 2009-06-29T13:06:56.663 に答える
1

Zip標準は、ファイル内で最大65536エントリをサポートします。JavaライブラリがZIP64拡張機能をサポートしていない限り、74,000エントリのアーカイブを読み書きしようとすると、正しく機能しません。

于 2009-02-10T06:42:20.147 に答える
-1

ディレクトリ構造をより便利に扱い、大量のターゲットを一度に圧縮する方法を作り直しました。プレーン ファイルは 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()
}
于 2009-08-03T14:31:49.927 に答える