문제

~ 74000 XML 파일이 포함 된 큰 ZIP 파일을 추출하기 위해 Java 클래스를 작성하려고합니다. Java Zip 라이브러리를 사용하여 압축을 풀려고 할 때 다음과 같은 예외를 얻습니다.

java.util.zip.zipexception: zip 파일의 항목이 너무 많습니다

불행히도 프로젝트의 요구 사항으로 인해 프로젝트의 요구 사항이 나오기 전에 지퍼를 분해 할 수 없으며 압축 프로세스를 자동화해야합니다 (수동 단계 없음). java.util.zip 또는 일부 제 3 자 Java Zip 라이브러리를 사용 하여이 제한을 해결할 수있는 방법이 있습니까?

감사.

도움이 되었습니까?

해결책

사용 ZipInputStream 대신에 ZipFile 아마 그렇게해야합니다.

다른 팁

Apache Ioutil 사용 :

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()
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top