apache.commons.compress  받는곳 

https://commons.apache.org/proper/commons-compress/download_compress.cgi

 

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;


public class ZipTest {

 public static void main(String[] args) throws Throwable {
  String path = "C:\\Users\\yuri\\Downloads\\commons-compress-1.16.1-bin\\commons-compress-1.16.1";
  //compress(path);
  decompress(path + "\\테스트.zip", path + "\\test");
 }

 /**
  * <pre>파일 압축하기</pre>
  * 파라메타 path가 폴더 이면 폴더 전체를 압축하고 파일경우는 파일만 압축
  * @param path
  * @throws IOException
  */
 public static void compress(String path) throws IOException {

  File file = new File(path);

  String files[] = null;

  // 파일이 디렉토리 일경우 리스트를 읽어오고
  // 파일이 디렉토리가 아니면 첫번째 배열에 파일이름을 넣는다.
  if (file.isDirectory()) {
   files = file.list();
  } else {
   files = new String[1];
   files[0] = file.getName();
   System.out.println(file.getName().getBytes());
  }

  // buffer size  int size = 1024;
  byte[] buf = new byte[size];

  String outZipNm = path + "\\테스트.zip";
  FileInputStream fis = null;
  ZipArchiveOutputStream zos = null;
  BufferedInputStream bis = null;

  try {

   // Zip 파일생성
   zos = new ZipArchiveOutputStream(new BufferedOutputStream(new FileOutputStream(outZipNm)));

   for (int i = 0; i < files.length; i++) {

    // 해당 폴더안에 다른 폴더가 있다면 지나간다.
    if (new File(path + "/" + files[i]).isDirectory()) {
     continue;
    }

    // encoding 설정
    zos.setEncoding("UTF-8");

    // buffer에 해당파일의 stream을 입력한다.
    fis = new FileInputStream(path + "/" + files[i]);

    bis = new BufferedInputStream(fis, size);

    // zip에 넣을 다음 entry 를 가져온다.
    zos.putArchiveEntry(new ZipArchiveEntry(files[i]));

    // 준비된 버퍼에서 집출력스트림으로 write 한다.
    int len;

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

    bis.close();

    fis.close();

    zos.closeArchiveEntry();

   }

   zos.close();

  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } finally {

   if (zos != null) {
    zos.close();
   }

   if (fis != null) {
    fis.close();
   }

   if (bis != null) {
    bis.close();
   }

  }
 }

 /**
  * <pre>파일압축 해제</pre>
  *
  * @param zipFileName 압축파일명
  * @param directory 압축이 풀릴 파일 경로
  * @throws Throwable
  */
 public static void decompress(String zipFileName, String directory) throws Throwable {

        File zipFile = new File(zipFileName);
        FileInputStream fis = null;
        ZipInputStream zis = null;
        ZipEntry zipentry = null;

        try {

            //파일 스트림
            fis = new FileInputStream(zipFile);

            //Zip 파일 스트림
            zis = new ZipInputStream(fis);

            //entry가 없을때까지 뽑기
            while ((zipentry = zis.getNextEntry()) != null) {

                String filename = zipentry.getName();

                File file = new File(directory, filename);

                //entiry가 폴더면 폴더 생성
                if (zipentry.isDirectory()) {
                    file.mkdirs();
                } else {
                    //파일이면 파일 만들기
                    createFile(file, zis);
                }

            }

        } catch (Throwable e) {
            throw e;
        } finally {

            if (zis != null)
                zis.close();

            if (fis != null)
                fis.close();

        }

    }

 /**
  * <pre>파일 경로에 압축 푼 파일 생성</pre>
  *
  * @param file
  * @param zis
  * @throws Throwable
  */
 private static void createFile(File file, ZipInputStream zis) throws Throwable {

        //디렉토리 확인
        File parentDir = new File(file.getParent());

        //디렉토리가 없으면 생성하자
        if (!parentDir.exists()) {
            parentDir.mkdirs();
        }

        //파일 스트림 선언
        try (FileOutputStream fos = new FileOutputStream(file)) {

            byte[] buffer = new byte[256];
            int size = 0;
            //Zip스트림으로부터 byte뽑아내기
            while ((size = zis.read(buffer)) > 0) {
                //byte로 파일 만들기
                fos.write(buffer, 0, size);
            }

        } catch (Throwable e) {
            throw e;
        }

    }

}

 

참조 :

압축하기 : 출처: http://javacpro.tistory.com/21 [버물리의 IT공부]

압축 풀기 : http://nowonbun.tistory.com/321 [명월 일지]

'JAVA > Common' 카테고리의 다른 글

ArrayList 정렬 및 자르기  (0) 2016.03.07
형 변환 모음...  (0) 2015.05.28
인코딩 한방에 테스트 하기  (0) 2015.04.23
String.format()을 이용하여 Date 표현하기  (0) 2013.10.01

+ Recent posts