2011-03-30 3 views
12

java.util.zip 패키지를 사용해 보았는데 너무 느립니다.많은 파일이 포함 된 zip 파일에서 1 개의 파일을 추출하는 가장 빠른 방법은 무엇입니까?

그렇다면 나는 LZMA SDK7z jbinding을 발견했지만 뭔가가 부족합니다. LZMA SDK는 사용법에 대한 종류의 설명서/자습서를 제공하지 않지만 매우 실망 스럽습니다. javadoc가 없습니다.

그러나 7z jbinding은 단 하나의 파일을 추출하는 간단한 방법을 제공하지 않지만 zip 파일의 모든 내용을 추출하는 방법을 제공합니다. 또한 압축 해제 된 파일을 저장할 위치를 지정하는 방법을 제공하지 않습니다.

어떤 아이디어로주세요 ???

답변

15

java.util.zip의 코드는 어떤 모양이며 어떤 크기의 zip 파일을 처리합니까?

나는 이것에 약 1 초 1,800 항목과 200MB의 zip 파일에서 4MB의 항목을 추출 할 수있어 :

OutputStream out = new FileOutputStream("your.file"); 
FileInputStream fin = new FileInputStream("your.zip"); 
BufferedInputStream bin = new BufferedInputStream(fin); 
ZipInputStream zin = new ZipInputStream(bin); 
ZipEntry ze = null; 
while ((ze = zin.getNextEntry()) != null) { 
    if (ze.getName().equals("your.file")) { 
     byte[] buffer = new byte[8192]; 
     int len; 
     while ((len = zin.read(buffer)) != -1) { 
      out.write(buffer, 0, len); 
     } 
     out.close(); 
     break; 
    } 
} 
+1

..... 우리가
나는 그것이 ZipFile API보다 빠르게 있다고 상상 초당 약 20 건의 요청. java.util.zip을 사용하여 파일을 압축 해제하는 속도는 0.5 초에서 2 초 사이 일 것입니다. 천천히. – lamwaiman1988

+2

나는 하나의 파일을 하나의 zip에서 필요로하는 초당 약 20 건의 요청을 처리한다고 가정합니다. 왜 미리 압축을 풀고 파일 시스템에서 직접 서비스를 제공하지 않는가? – WhiteFang34

+4

FileInputStream과 ZipInputStream 사이에 BufferedInputStream이 있으면 코드가 더 빨라집니다. – EJP

6

오히려 ZipInputStream보다 ZipFile를 사용합니다.

문서에이 사실이 표시되어 있지는 않지만 (문서에있는 JarFile) 문서를 읽는 데 랜덤 액세스 파일 작업을 사용해야합니다. ZIP 파일에는 알려진 위치에 디렉토리가 있기 때문에 특정 파일을 찾기 위해 IO가 적게 발생해야합니다.

몇 가지주의 사항 : 필자가 아는 한 Sun 구현은 메모리 맵 파일을 사용합니다. 즉, 가상 주소 공간은 파일뿐만 아니라 JVM의 다른 모든 파일을 수용 할만큼 커야합니다. 32 비트 서버에서 문제가 될 수 있습니다. 다른 한편, 32 비트에서 메모리 맵핑을 피하기에 충분히 똑똑하거나 디렉토리 만 메모리 맵핑 할 수 있습니다. 나는 시도하지 않았다.

또한 여러 파일을 사용하는 경우 사용 후 파일을 닫으려면 try/finally을 사용해야합니다.

7

속도를 벤치마킹하지는 않았지만 Java 7 이상을 사용하여 다음과 같은 파일을 추출합니다.

zip 파일 test.zip에서 META-INF/MANIFEST.MF를 추출하는 간단한 예를

: 우리는 외부인의 사용을 위해 웹 응용 프로그램을하고있는

// file to extract from zip file 
String file = "MANIFEST.MF"; 
// location to extract the file to 
File outputLocation = new File("D:/temp/", file); 
// path to the zip file 
Path zipFile = Paths.get("D:/temp/test.zip"); 

// load zip file as filesystem 
try (FileSystem fileSystem = FileSystems.newFileSystem(zipFile, null)) { 
    // copy file from zip file to output location 
    Path source = fileSystem.getPath("META-INF/" + file); 
    Files.copy(source, outputLocation.toPath()); 
} 
+0

. 이 작품은 :) –

+0

작동 및 번개 빠른 ...이 허용 된 대답 (가정 Java 7 이상)합니다. – leo

관련 문제