본문 바로가기

소프트웨어 및 운영체제에 관해 조금 더 심도 있는 이야기를 나누는 포럼 게시판입니다 ((Windows, OSX, Linux, ubuntu, 그외에 vmwaere, server 오픈소스등)

자바 zip 파일로 압축 하는 소스

조회 수 1426 추천 수 0 2014.06.24 15:05:43
링크 :  
import system.log.Logger;
import system.exception.Exception;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
 
/**
 * Created by IntelliJ IDEA.
 * Date: 2006. 7. 6
 * Time: 오후 3:48:11
 * To change this template use File | Settings | File Templates.
 * java.util.zip에 있는 놈을 쓰게 되면 압축할 때 한글명으로 된 파일은 깨져서 들어간다..
 * 결국 그때문에 나중에 압축을 풀때 에러가 나게 된다...
 * 해서 이놈을 jazzlib 라이브러리를 사용하여 해결하였다....
 */
public class compressTest {
    static Logger logger = (Logger)Logger.getLogger();
    static final int COMPRESSION_LEVEL = 8;
    static final int BUFFER_SIZE = 64*1024;
 
    public static void main(String[] args) throws IOException {
        // 압축할 폴더를 설정한다.
        String targetDir = "D:\test\testest";
        // 현재 시간을 설정한다.
        long beginTime = System.currentTimeMillis();
        int cnt;
        byte[] buffer = new byte[BUFFER_SIZE];
        FileInputStream finput = null;
        FileOutputStream foutput;
 
        /*
         **********************************************************************************
         * java.util.zip.ZipOutputStream을 사용하면 압축시 한글 파일명은 깨지는 버그가
         * 발생합니다.
         * 이것은 나중에 그 압축 파일을 해제할 때 계속 한글 파일명이 깨는 에러가 됩니다.
         * 현재 Sun의 공식 입장은 이 버그를 향후 수정할 계획이 없다고 하며
         * 자체적으로 공식적 버그라고 인정하고 있지 않습니다.
         * 이런 비영어권의 설움...ㅠ.ㅠ
         * 해서 이 문제를 해결한 net.sf.jazzlib.ZipOutputStream을 추가하오니
         * 이 라이브러리 사용을 권장하는 바입니다.
         *********************************************************************************/
        net.sf.jazzlib.ZipOutputStream zoutput;
 
        /*
         ********************************************
         * 압축할 폴더명을 얻는다. : 절대 경로가 넘어올 경우 --> 상대경로로 변경한다...
         *********************************************/
        targetDir.replace('\', File.separatorChar);
        targetDir.replace('/', File.separatorChar);
        String dirNm = targetDir.substring(targetDir.lastIndexOf(File.separatorChar)+1
                                                        , targetDir.length());
        // 압축할 폴더를 파일 객체로 생성한다.
        File file = new File(targetDir);
        String filePath = file.getAbsolutePath();
        logger.debug("File Path : " + file.getAbsolutePath());
 
        /*
         **************************************************************************
         * 폴더인지 파일인지 확인한다...
         * 만약 넘겨받은 인자가 파일이면 그 파일의 상위 디렉토리를 타겟으로 하여 압축한다.
         *****************************************************************************/
        if (file.isDirectory()) {
            logger.debug("Directory.........");
        } else {
            file = new File(file.getParent());
        }
        // 폴더 안에 있는 파일들을 파일 배열 객체로 가져온다.
        File[] fileArray = file.listFiles();
 
        /*
         *****************************************************************
         * 압축할 파일 이름을 정한다.
         * 압축할 파일 명이 존재한다면 다른 이름으로 파일명을 생성한다.
         *****************************************************************/
        String zfileNm = filePath + ".zip";
        int num = 1;
        while (new File(zfileNm).exists()) {
            zfileNm = filePath + "_" + num++ + ".zip";
        }
        logger.debug("Zip File Path and Name : " + zfileNm);
        // Zip 파일을 만든다.
        File zfile = new File(zfileNm);
        // Zip 파일 객체를 출력 스트림에 넣는다.
        foutput = new FileOutputStream(zfile);
        // 집출력 스트림에 집파일을 넣는다.
        zoutput = new net.sf.jazzlib.ZipOutputStream((OutputStream)foutput);
        net.sf.jazzlib.ZipEntry zentry = null;
 
        try {
            for (int i=0; i < fileArray.length; i++) {
                // 압축할 파일 배열 중 하나를 꺼내서 입력 스트림에 넣는다.
                finput = new FileInputStream(fileArray[i]);
                // ze = new net.sf.jazzlib.ZipEntry ( inFile[i].getName());
                zentry = new net.sf.jazzlib.ZipEntry(fileArray[i].getName());
                logger.debug("Target File Name for Compression : "
                                    + fileArray[i].getName()
                                    + ", File Size : "
                                    + finput.available());
                zoutput.putNextEntry(zentry);
 
                /*
                 ****************************************************************
                 * 압축 레벨을 정하는것인데 9는 가장 높은 압축률을 나타냅니다.
                 * 그 대신 속도는 젤 느립니다. 디폴트는 8입니다.
                 *****************************************************************/
                zoutput.setLevel(COMPRESSION_LEVEL);
                cnt = 0;
                while ((cnt = finput.read(buffer)) != -1) {
                    zoutput.write(buffer, 0, cnt);
                }
                finput.close();
                zoutput.closeEntry();
            }
            zoutput.close();
            foutput.close();
        } catch (Exception e) {
            logger.fatal("Compression Error : " + e.toString());
            /*
             **********************************************
             * 압축이 실패했을 경우 압축 파일을 삭제한다.
             ***********************************************/
            logger.error(zfile.toString() + " : 압축이 실패하여 파일을 삭제합니다...");
            if (!zfile.delete()) {
                logger.error(zfile.toString() + " : 파일 삭제가 실패하여 다시 삭제합니다...");
                while(!zfile.delete()) {
                    logger.error(zfile.toString() + " : 삭제가 실패하여 다시 삭제합니다....");
                }
            }
            e.printStackTrace();
            throw new Exception(e);
        } finally {
            if (finput != null) {
                finput.close();
            }
            if (zoutput != null) {
                zoutput.close();
            }
            if (foutput != null) {
                foutput.close();
            }
        }
        long msec = System.currentTimeMillis() - beginTime;
        logger.debug("Check :: >> " + msec/1000 + "." + (msec % 1000) + " sec. elapsed...");
    }
}
profile
엮인글 :
List of Articles
번호 제목 글쓴이 추천 수 최근 수정일 조회 수
인기글↑ 정보 전원 관리 - 최고의 성능 설정 팁 file [1] 회원_55487929 3 2019-02-08 19:16 66
인기글↑ 정보 요즘 핫한 게임 프레임 상승방법 file [2] 회원_32791657   2019-02-10 00:13 57
인기글↑ 윈도우에서 안드로이드 실행하는 방법 (녹스) [3] 회원_86034948   2019-01-20 23:35 61
159 4k 영상이 보편화 되려면 UHD TV가 충분히 보급되고 평가단   2014-06-29 05:16 1146
158 TrueCrypt 개발이 중단되었네요... file 라이너스~   2014-06-25 10:12 1373
157 우분투 확장자 tar 혹은 tgz 풀기 라이진   2014-06-24 15:12 1468
156 웹서버용 IPTABE 설정 라이진   2014-06-24 15:11 1139
155 Internal Server Errorr 500 페이지 문구에서 확인 해야 할 것. 라이진   2014-06-24 15:11 1281
154 RSS Reader (wfx_rss.wfx) ini파일 RSS주소 라이진   2014-06-24 15:10 1336
153 사이트 이미지 무단링크막는법 .htaccess 라이진   2014-06-24 15:09 1038
152 우분투에서 log폴더를 삭제했을 경우 라이진   2014-06-24 15:09 1160
151 대용량 파일 첨부 업로드시 php.ini 파일조정값들 라이진   2014-06-24 15:09 1236
150 윈도우 2000 DNS 서버의 백업 및 복원 (Apache, PHP 설치문서 포함) 라이진   2014-06-24 15:08 1270
149 php.ini 옵션 설명 - short_open_tag = On, register_globals = On 라이진   2014-06-24 15:07 1303
148 mod_bandwidth 설치, httpd.conf 파일설정 라이진   2014-06-24 15:06 1165
147 PrintWriter/BufferedReader/ObjectOutputStream/ObjectInputStream 간단한 예제 라이진   2014-06-24 15:06 962
» 자바 zip 파일로 압축 하는 소스 라이진   2014-06-24 15:05 1426
145 서버1대에서 여러 사이트만들때 (아파치 버츄얼호스트 설정법) 라이진   2014-06-24 15:05 1138
144 우분투 - VMWare Tool 설치방법 라이진   2014-06-24 15:04 1155
143 우분투 명령어 한줄로 서버 설치하기 라이진   2014-06-24 15:04 1004
142 (개발자분들을 위한 익스 호환성 태그) X-UA-Compatible Meta Tag Description and Uses: 라이진   2014-06-24 15:03 1413
141 쿨노보(크롬 플러스)의 종말? [1] 라이너스~   2014-06-24 14:59 2069
140 워드프레스 실시간 작업 wjdgus1   2014-06-24 14:56 955
서버에 요청 중입니다. 잠시만 기다려 주십시오...