2009-10-01 4 views
3

내부에 임의의 수의 zip 파일을 포함 할 수있는 zip 파일이 있습니다 (재귀 적으로도). 나는 그들 모두를 반복 할 필요가있다.ZipFile 내부의 ZipFile

지금 당장 zipInputStream 및 zipFile을 매개 변수로 사용하는 함수가 있습니다. 문제는; 다른 우편 번호 안에 우편 번호가 있으면이 함수를 재귀 적으로 다시 호출합니다. 그래서 다른 zipfile 안에 zip 파일을위한 zipFile 객체를 만드는 방법을 모른다. 누군가 그것을 할 수있는 방법을 제안 할 수 있습니까? 전에 이것을 보았습니까?

스 니펫은 다음과 같습니다.

private void checkZIP(ZipInputStream zInpStream, ZipFile zf) { 
    try { 
    ZipEntry zipEntry = zInpStream.getNextEntry(); 
    while (zipEntry != null) { 
     String entryName = zipEntry.getName(); 

     if(entryName.endsWith(".zip")) 
      checkZIP(new ZipInputStream(zf.getInputStream(zipEntry)),<NEW ZIPFILE OBJECT FOR THIS ENTRY>); 


     //other files parsing apart from zip. 

     zInpStream.closeEntry(); 
     zipEntry = zInpStream.getNextEntry(); 
    } 
    zInpStream.close(); 
    } catch(Exception ioe) { 
    //catching specific exceptions here. But did not want to put al 
    } 
} 

편집 : 나는 그 때문에 zip 파일 객체가 필요합니다. XML 파일을 발견하면 Document 객체를 만들어야한다. 따라서 DocumentBuilder에있는 parse() 메서드의 일반 zipInputStream을 전달하면 스트림이 닫히고 다시 사용할 수 없습니다. 그래서 (ZipFile object).getInputStream(currentEntryForXML)을 내부에 사용했습니다. DocumentBuilder parse().

+2

그런 다음 무 조작으로'close' 메소드를 오버라이드 (override),이 중 하나를 사용하여'ZipInputStream'을 래핑하는'FilterInputStream'을 확장합니다. – erickson

+3

주의 - 재귀 zip 파일을 만드는 것이 가능합니다 (그리고 완료되었습니다) : http://www.steike.com/code/useless/zip-file-quine/ –

+0

예, 조심합니다 .. 많이 고마워요. – vpram86

답변

4

아카이브 내부의 zip 파일에는 ZipFile을 만들 수 없습니다. 그런데 왜 당신의 방법에서이 주장이 필요한가? 당신은 스트림을해야하는 경우, 단지 zInpStream.getNextEntry에 전화 후

checkZIP(new ZipInputStream(zInpStream)); 

처럼 contstructor 매개 변수로 인수 zInpStream()를 사용 zInpStream 이미 해당 항목의 선두에 자리 매김되고 getNextEntry 때까지 해당 항목을 읽()가 호출됩니다.

편집. 편집을 봤어. 스트림 폐쇄를 방지하면 충분할 것입니다. 약간 수정 된 FilterInputStream을 사용하면 close() 호출을 close가 아닌 zipInputStream의 closeEntry()에 위임 할 수 있습니다.

public class ZipGuard extends java.io.FilterInputStream { 
    public ZipGuard(ZipInputStream is) { 
     super(is); 
    } 

    @Override 
    public void close() throws IOException { 
     ((ZipInputStream) in).closeEntry(); 
    } 
} 

그리고 checkZip이 가드 작성 :

checkZip(new ZipInputStream(new ZipGuard(zInpStream))); 
+0

제 편집을 확인하십시오. XML을 파싱 할 때 동일한 스트림을 사용합니다. 그리고 스트림을 닫습니다. – vpram86

+0

그것은 일했다!! :) 고마워요! :) – vpram86

관련 문제