티스토리 뷰

Programming Language/JAVA

Zip 파일 만들기

광식'S Story 2009. 1. 20. 18:30

* 압축 파일을 만들때 파일 대상이 폴더 단위가 아닌 파일 단위로 해야한다. (당연하겠지 파일스트림으로 읽어 들일때 폴더를 읽을시 에러(FileNotFoundException)가 날테니까)
==> File target_file = new File("C:/test/test.txt");      // 특정 파일의 File객체

* 만약 특정 폴더를 압축하고 싶을때는 폴더 경로로한 File 객체를 만들어서 작업하면 된다.
==> File target_folder = new File("C:/test");            // 특정 폴더의 File객체
      File[] target_file = target_folder.getlistFiles();   // 특정 폴더의 하위 파일 & 폴더의 File객체

* 이제는 압축되어 만들어질 Zip파일의 File 객체를 만들어 보자.(굳이 File 객체를 만들지 않아도 된다. 대상 파일도
  마찬가지로 그냥 String 객체로 경로를 지정해 주지만 하면된다. 왜나면 파일을 만들어 내는것은 File객체가 아니고
  Stream 객체이므로 어떤것으로 하든지 상관은 없다. File 객체를 사용한 이유는 경로로 지정된 곳에 실제로 폴더나
  파일이 존재 하지 않을시의 처리를 할 수 있기 때문이다.)
==> File zip_file = new File("C:/test/test_zip.zip");   // 저장하고자 하는 경로와 이름을 지정해 준다.

* 이제 File 객체를 다 만들었으니 파일을 읽어들일 Stream을 만들어 보자.
==> FileInputStream fis = new FileInputStream(target_file);  // Data를 읽어들이기위한 Stream.
      // 이를 더 원활히 사용하려면 버퍼로 감싸준다. BufferedInputStream bis = new BufferedInputStream(fis);

* 다음엔 Zip파일을 만들어낼 Stream을 만들어 보자.
==> FileOutputStream fos = new FileOutputStream(zip_file);  // Data를 쓸수있는 Stream.
      // 이를 더 원활히 사용하려면 버퍼로 감싸준다. BufferedOutputStream bos = new BufferedOutputStream(fos);
      ZipOutputStream zos = new ZipOutputStream(bos);       // Zip파일을 만들 수 있는 Stream. fos를 감싼다.

* 이제 ZipOutputStream 객체의 putNextEntry(Entry e) 메소드를 이용해 엔트리(정확하지는 않지만 Zip파일을 만들
  어 낼때 기입되어질 위치와 정보를 말하는 것 같다.)를 생성한다.
==> zos.putNextEntry( new Entry( "a/"+target_file.getName() ) );   
      // Entry 객체 생성시 현재의 파일을 어떻게 저장 할지에 대한 것을 정한다. 위와 같이 "a/"+target.file.getName()
      으로 하면 a라는 폴더안에 현재 압축되어지고 있는 파일의 이름과 똑같이해서 압축된다. "a/test.txt" 로

* 압축률도 설정할 수 있다. 디폴트는 8이고 9는 가장 높은 압축률을 나타낸다. 하지만 속도가 느려진다.
==> final int COMPRESSION_LEVEL = 8;    out.setLevel(COMPRESSION_LEVEL);

* 이제 기본적인 모든 설정은 끝났으니 이제 실제로 파일을 읽어서 쓰는 단계만 해주면 된다.
==> int len;
      // 압축 대상의 Data(파일)을 설정된 사이즈 만큼 읽어들인다.
     
int size = 8162;
      byte[] buf = new byte[size];

      while ((len = bis.read(buf, 0, size)) > 0) {
           zos.write(buf, 0, len);
      }

* 모든 순서가 끝나면 열었던 스트림을 모두 닫는다.
==> zos.closeEntry();    // 한개의 파일이 압축되었으면 현재의 엔트리는 닫는다.
      fis.close();
      fos.close();



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함