2011-08-05 4 views
1

폴더에 포함 된 여러 유형의 파일을 압축/압축 해제해야하는데 해당 폴더의 크기가 10-11GB 이상일 수 있습니다. 다음 코드를 사용했지만 데이터를 압축하는 데 오랜 시간이 걸립니다.Java에서 큰 크기의 데이터 압축 및 압축 해제?

BufferedReader in = new BufferedReader(new FileReader("D:/ziptest/expansion1.MPQ")); 
BufferedOutputStream out = new BufferedOutputStream(
    new GZIPOutputStream(new FileOutputStream("test.gz"))); 

int c; 
while ((c = in.read()) != -1) 
    out.write(c); 
in.close(); 
out.close(); 

나에게 자바에서 약간 빠른 압축 및 압축 해제 라이브러리를 제안하십시오, 나는 또한 100메가바이트 각각의 덩어리 같이 다른 부분에서 큰 파일을 분할 할 수 있습니다.

+2

블리자드 MoPaQ 파일을 압축하려는 경우 많은 압축을 볼 수 없습니다. 파일 형식이 이미 압축되어 있습니다. – Qwerky

답변

7

Reader/Writer는 텍스트 전용이며 이진 코드를 읽으려고하면 손상됩니다.

대신 FileInputStream을 사용하는 것이 좋습니다. 데이터를 복사하는 가장 빠른 방법은 자체 버퍼를 사용하는 것입니다.

InputStream in = new FileInputStream("D:/ziptest/expansion1.MPQ"); 
OutputStream out = new GZIPOutputStream(
      new BufferedOutputStream(new FileOutputStream("test.gz"))); 

byte[] bytes = new byte[32*1024]; 
int len; 
while((len = in.read(bytes)) > 0) 
    out.write(bytes, 0, len); 

in.close(); 
out.close(); 

는 바이트의 큰 덩어리를 읽기 때문에,이 복사본 하나를 제거로/OuptuStream을 BufferedInput하지 더 효율적입니다. GZIPOutputStream 뒤에는 BufferedOutptuStream이 있습니다. 생성 된 데이터의 크기를 제어 할 수 없기 때문입니다.

BTW : 자바로만 이것을 읽는다면 약간 더 빠르고 작은 DeflatorOutputStream을 사용할 수 있지만 Java AFAIK에서만 지원됩니다.

+4

한 번에 +1 읽기 덩어리가 아닌 한 번에 엄청난 성능 향상 (몇 배 빠르게)을 제공 할 수 있습니다. – Qwerky