2011-08-09 5 views
4

매우 큰 zip 아카이브에서 하나의 파일 만 얻으려고합니다. 이 아카이브에는 루프에서 내 파일을 찾지 않기 때문에 약 100,000 개의 파일이 포함됩니다. 나는 이것이 리눅스의 명령과 같은이 경우를위한 해결책이라고 생각한다. 내가 코드안드로이드에 여러 파일이있는 .zip 파일에서 단일 파일의 압축을 풉니 다.

try { 
    FileInputStream fin = new FileInputStream(rootDir+"/archive.zip"); 
    ZipInputStream zin = new ZipInputStream(fin); 
    ZipEntry ze = new ZipEntry("myfile.txt"); 

    FileOutputStream fout = new FileOutputStream(rootDir+"/buff/" + ze.getName()); 
    for (int c = zin.read(); c != -1; c = zin.read()) { 
     fout.write(c); 
    } 

    zin.closeEntry(); 
    fout.close(); 
    zin.close(); 

} catch(Exception e) { 
    Log.e("Decompress", "unzip", e); 
} 

이 코드는 다음과 같은 쓴

unzip archive.zip myfile.txt 

는 버프 디렉토리에 새 파일을 생성하지만,이 파일이 비어 있습니다! 제발,이 문제로 도와주세요!

시간 내 주셔서 감사합니다.

답변

3

저는 Java를 처음 접했지만 API 문서에는 java.util.zip을 포함하여 표준 자바 라이브러리에 대한 정보가 상당히 합리적입니다. 거기에서 ZipFile 항목으로 이동하면 방법 목록으로 스크롤하여 getEntry이라는 메서드를 찾을 수 있습니다. 이것은 당신이 시작해야 할 경로 인 것 같습니다!

편집 : 당신은 아마 디렉토리를 포함해야합니다 염두에 곰 (예 : "DIR \ subdirF \ subdirW \ FileThatYouWant.txt") 그 파일이있는 방법이 될 것으로 보인다 있기 때문에, 전화를 할 때 당신이 하나씩 지나갈 때 이름 지어집니다.

EDIT 2 : 상당한 정보가 여기에 있습니다 : Compressing and Decompressing Data Using Java APIs, 조금이라도 읽고 싶다면 : D. 메모리 제약 조건에 따라 AFAIK에서 아카이브의 각 ZipEntry (평균 50,000 건)를 수행하도록 요구하는 ZipInputStream 개체를 사용하는 것이 합당한 해결책 일 수 있지만 전체 파일을로드하지 않아도됩니다 메모리에. 성능면에서 볼 때, 수동으로 스테핑을 수행하는 것이이 틈새 기능의 현재 구현만큼 효율적일 것입니다.

+0

죄송하지만 해결책은 아닙니다. ZipFile 초기화 읽기 구멍 파일과 같지만 크기가 커서 메모리 부족 오류가 있습니다. – lubart

+0

아카이브를로드하지 않고 큰 아카이브에서 압축 파일을 추출 할 수 있습니까? 장치 또는 인터넷 어딘가에 보관 파일이 있습니까? 나는 이것이 불가능한 일처럼 들리기 시작할까 두려워하지만 좀 더 많은 정보를 제공해 주시기 바랍니다. –

+0

답변 해 주셔서 감사합니다. 이 파일은 sdcard에 있습니다. 예, 모든 zip 파일을 읽지 않고 아카이브에서 하나의 파일을 추출하고 싶습니다. 나는 리눅스에서 unzip 명령을 사용하는 것이 가능하다는 것을 안다. 안드로이드에서도 가능하다는 희망을 가지고있다. – lubart

관련 문제