Java 에서 압축된 파일을 처리하는 알고리즘이 궁금합니다~


안녕하세요~

자바로 압축을 해제하는 알고리즘이나 프로세스가 궁금해서 질문 드립니다~

ZIP 파일로 압축된, MultipartFile 또는 File 로 부터 압축을 해제하게 되면

보통의 경우 새로운 파일을 만들게됩니다. (많은 샘플코드의 경우....)

압축파일 > 압축해제 > 압축하기 전 파일생성(오리진 파일)

하지만, 사실상 압축을 해제하는 건 해당파일을 다른곳으로 업로드 하기 위함인데요,

결국 임시파일을 만들어줘야 하고, 업로드가 끝나면 해당 파일을 삭제하게끔 하는 것 같은데

이 방법이 최선인지 궁금합니다.

다른 방법이 있는것은 아닌지.... 궁금합니다~

  • 2016년 06월 28일에 작성됨

조회수 387


1 답변


좋아요
3
싫어요
채택취소하기

JavaDoc의 예제를 먼저 참고해보세요.

우선 질문의 의도가 ZIP 압축된 내용중 일부를 임시파일 생성없이 전송하는 것이 목적이라면, 위의 예제를 다음과 같이 변형해볼 수 있겠습니다.

Zip파일의 경우, ZipEntry 객체를 통해서 ZIP 압축된 내용의 파일들을 찾아낼 수 있습니다.

import java.io.*;
import java.util.zip.*;

public class Sample {
   final int BUFFER = 2048;
   public static void main (String argv[]) {
      try {
         BufferedOutputStream dest = null;
         FileInputStream fis = new 
       FileInputStream(argv[0]);
         ZipInputStream zis = new 
       ZipInputStream(new BufferedInputStream(fis)); // ZIP압축을 읽기 위한 스트림 준비
         ZipEntry entry; // ZIP압축된 내용에 포함된 파일들에 대응될 변수
         while((entry = zis.getNextEntry()) != null) { // 순차적으로 검색합니다.
            ...;  
           // 찾고자 하는 파일이 맞을 경우
          // entry.name() 은 압축 파일내의 경로를 포함한 이름입니다.           
            int count;
            byte data[] = new byte[BUFFER];
            OutputStream os = ...; // 압축해제된 내용을 전송하려고 하는 스트림
            dest = new 
              BufferedOutputStream(os, BUFFER);
            while ((count = zis.read(data, 0, BUFFER)) 
              != -1) {
               dest.write(data, 0, count); // 압축해제하면서 전송.
            }
            dest.flush();
            dest.close();
         }
         zis.close();
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}

위와 같이 하면, 임시파일을 만들지 않고 할수는 있습니다. 압축해제하여 포함된 모든 파일을 전송하는 것이 목적이라면, 임시파일을 생성하는 것이 더 좋을 수도 있습니다.

전송과 동시에 압축/압축해제 참고.

단일 파일 스트림에 대해서 압축을 하고자 한다면, GZIP 압축 스트림을 사용해보는 것도 좋을것 같습니다. GZIP은 스트림 그대로 압축(혹은 압축해제)하면서 처리할 수 있는 압축알고리즘이어서 별도의 임시파일을 생성하지 않고 사용할 수 있습니다.

GZIPInputStream

OutputStream os = new ByteArrayOutputStream(); // 파일 혹은 소켓, HTTP 등 쓰기 위한 스트림. 이 예에서는 ByteArrayOutputStream으로 하였습니다.
GZIPOutputStream gout= new GZIPOutputStream(os);

gout.write(...); // gout에 압축되지 않은 데이터를 쓰면, 결과적으로 압축한 것을 타겟 스트림(os)에 전달합니다.

gout.close();

GZIPOutputStream

byte[] gzippedData = ...; // GZIP으로 압축된 데이터
InputStream is = new ByteArrayInputStream(gzippedData); // 파일 혹은 소켓, HTTP 등에서 읽기 위한 스트림. 이예에서는 ByteArrayInputStream으로 하였습니다.
GZIPInputStream gin = new GZIPInputStream(is);

byte[] buffer = new byte[100];
int length;
while((length = bufferedInputStream.read(buffer)) > 0) {
   ...; // buffer에는 압축이 해제된 내용이 들어갑니다.
}

gin.close();
  • 2016년 06월 28일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close