2009-07-22 5 views
2

Java에서 누가 대용량 파일을 압축하거나 압축하지 않을지 알고 있습니다. 완전히 부당합니다. 잠시 불신을 중지하고 큰 zip 파일의 압축을 풀 이유가 있다고 가정합니다.ZipFile을 사용하지 않고 압축 파일에 무작위로 액세스 (ZipFile이 주요 버그를 가지고 있기 때문에)

문제 1 : ZipFilebug (bug # 6280693)이고 Sun은 java 1.6 (Mustang)에서이를 수정했습니다. 이 수정은 우리의 소프트웨어가 java 1.4를 지원해야하기 때문에 도움이되지 않습니다. 버그는 내가 이해하는 것처럼 이처럼 작동합니다. 다음 코드가 실행되면 Java는 전체 파일을 저장할만큼 큰 메모리 덩어리를 할당합니다.

ZipFile zipFile = new ZipFile("/tmp/myFile.zip"); 

/tmp/myFile.zip이 4GB 인 경우, java는 4GB를 할당합니다. 이로 인해 힙 예외가 발생합니다. + 4GB의 힙 크기는 불행히도 용인 할만한 해결책이 아닙니다. = (

솔루션 1 실행하려면 :. 메모리 풋 프린트를 스트림으로 파일을 처리함으로써 절감하고 제어하는 ​​데 사용할 ZipInputStream

byte[] buf = new byte[1024]; 
FileInputStream fs = new FileInputStream("/tmp/myFile.zip") 
ZipInputStream zipIn = new ZipInputStream(fs); 

ZipEntry ze = zipIn.getNextEntry(); 

while (ze != null){ 
    while ((int cr = zipIn.read(buf, 0, 1024)) > -1) 
    System.out.write(buf, 0, len); 
    ze = zipIn.getNextEntry(); 
} 

문제 2 : 나는 무작위로 ZipEntries 액세스 싶습니다. . 그리고

 ZipInputStream zin = new ZipInputStream("/tmp/myFile.zip"); 

     ZipEntry ze = zin.getNextEntry(); 
     List<ZipEntry> zes = new ArrayList<ZipEntry>(); 

     while(ze!=null){ 
      zes.add(ze); 
      ze = zin.getNextEntry(); 
     } 

내가 특정 ZipEntry를 I의 압축을 해제해야합니다, 난 단지 전체 스트림을 통해 검색 할 필요없이, 하나 또는 ZipEntry의 압축을 해제하고자한다 현재 내가 zipEntries의 목록을 구축하고, ZES라고 모든 zi를 통해 iteratorate 일치하는 zipEntry를 찾을 때까지 pEntry를 실행 한 다음 압축을 풉니 다.

 ZipEntry ze = in.getNextEntry(); 
     while (! ze.getName().equals(queryZe.getName())){ 
      ze = zin.getNextEntry(); 
     } 

     int cr; 

     while ((cr = zin.read(buf)) > -1) 
      System.out.write(buf, 0, cr); 

Quertion : ZipFile에는 ZipEntries에 무작위로 액세스 할 수있는 기능이 있습니다.

new BufferedInputStream(zipFile.getInputStream(zipEntry)); 

ZipFile을 사용하지 않고도 동일한 기능을 어떻게 얻을 수 있습니까?

ZipInputStream에는 strangebehavior이 약간 있습니다. 자바와 ZipFiles에

특히 좋은 문서는 여기에서 찾을 수 있습니다 :

  1. 일의 :

    http://commons.apache.org/compress/zip.html

    사항에 대한 답변에서 제안 아파치 평민 ZipFile에 태양 ZipFile를 대체 전환에 ZipFile.entries()은 항상 파일에서 발생하는 순서대로 ZipEntries를 반환하지만 반면에 apache commons ZipFile.getEntries()은 임의로 항목을 반환합니다. 주문. 일부 코드는 항목이 "순서대로"있다고 가정하기 때문에 이것은 흥미로운 버그를 야기했습니다.

답변

2

1.4 이상에서 작동하는 Apache Commons Compress을 볼 수는 있지만 동일한 버그가 두포에 노출되는지 여부는 알 수 없습니다.

+2

아니야? http : //commons.apache.org/compress/apidocs/org/apache/commons/compress/archivers/zip/ZipFile.html – toluju

+0

그러면 무엇입니까? http://commons.apache.org/compress/apidocs/org/apache/commons/compress/archivers/zip/ZipFile.html – jsight

+0

오! 내 실수! 감사! =) –

관련 문제