2014-02-20 15 views
8

7-zip 바이트 스트림에서 일부 파일을 추출하려면 하드 디스크에 저장할 수 없으므로 RandomAccessFile 클래스를 사용할 수 없습니다. sevenzipjbinding 소스 코드를 읽은 다음 파일을 압축 해제합니다. SevenZip.Compression.LZMA.Decoder.Code(java.io.InputStream inStream,java.io.OutputStream outStream,long outSize,ICompressProgressInfo progress)하드 디스크에 저장하지 않고 Java의 7-zip 스트림에서 파일을 추출하는 방법은 무엇입니까?

다른 language.And 공식 패키지의 방법 SevenZip에 의해 작성 같은 일부 폐쇄 소스 일 lib7-Zip-JBinding.so은 하나의 파일의 압축을 해제 할 수 있습니다.

그래서 순수 자바로 7 바이트 우편 스트림을 압축 해제 할 수 있습니까?

아무도 해결책이 있습니까?

불쌍한 영어로 죄송합니다. 온라인 답변을 기다리고 있습니다.

+1

는 [아파치 코 몬즈, 압축] (번 봐 https://commons.apache.org/proper/commons-compress /) 라이브러리는 7z 구현을 가지고 있다고 믿는다. – MadProgrammer

답변

9

Commons compress 1.6 이상은 7z 형식 조작을 지원합니다. 시도 해봐.

참조 :

http://commons.apache.org/proper/commons-compress/index.html

샘플 :

SevenZFile sevenZFile = new SevenZFile(new File("test-documents.7z")); 
    SevenZArchiveEntry entry = sevenZFile.getNextEntry(); 
    while(entry!=null){ 
     System.out.println(entry.getName()); 
     FileOutputStream out = new FileOutputStream(entry.getName()); 
     byte[] content = new byte[(int) entry.getSize()]; 
     sevenZFile.read(content, 0, content.length); 
     out.write(content); 
     out.close(); 
     entry = sevenZFile.getNextEntry(); 
    } 
    sevenZFile.close(); 
+0

팁 : 7-zip 바이트 스트림은 디스크에 저장된 파일이 아니라 소켓 스트림 (또는 http 요청 스트림)이다. 7z가 완전 메모리 해상도를 적용하지 않기 때문에 File 클래스를 사용하지 마십시오. 압축 해상도를 xz로 변경합니다. – user3330817

+1

Android에서 Apache Commom-Compress를 사용해 보았습니다. 여기서 내 경험을 공유하고 싶습니다. 이 솔루션은 하나의 파일을 250Mb에서 750Mb로 압축하는 데 3 시간 (3 시간)이 걸리므로 내 목표에는 전혀 받아 들일 수 없습니다. 구현이 매우 느리고 최적화되지 않은 것 같습니다. 내 전화는 Nexus 5입니다. –

+0

Commons Compress 라이브러리는 OP가 요청한대로 7z 형식을 조작 할 수 있지만 스트림에서 가져온 것이 아닙니다. – Unda