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

조회수 4208회

안녕하세요~

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

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

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

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

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

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

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

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

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 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();
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)