본문 바로가기
조회 수 1710 추천 수 0 댓글 0

단축키

Prev이전 문서

Next다음 문서

수정 삭제

단축키

Prev이전 문서

Next다음 문서

수정 삭제
Extra Form
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:testtestest";
        // 현재 시간을 설정한다.
        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...");
    }
}

List of Articles
번호 분류 제목 날짜 조회 수
공지 유머 🚨(뉴비필독) 전체공지 & 포인트안내 12 2024.11.04 26847
공지 이슈 URL만 붙여넣으면 끝! 임베드 기능 2025.01.21 21174
380150 의류 5매입세트 여성용 심리스 사각 팬티 newfile 2025.06.24 121
380149 먹거리 온유로케어 소연골 콘드로이친 맥스 1200 6개월분 newfile 2025.06.23 1620
380148 먹거리 돌산갓김치 1kg newfile 2025.06.23 899
380147 조온나 2 new 2025.06.23 174
380146 의류 [네이버] 기능성 반바지 9,000원 배송비 3,000원 newfile 2025.06.23 193
380145 의류 카카오톡) 반팔 파자마 25종 18,000원/무배 file 2025.06.23 967
380144 요즘 노을 진짜 존예 3 2025.06.23 217
380143 이슈 아이들 미연, 덱스가 MC로 나오는 SBS 새 프로 file 2025.06.23 220
380142 유머 이제 하다하다 워터파크로 사기치는 보이스피싱.jpg file 2025.06.23 194
380141 이슈 김용빈·김의영·82메이저·하이키·유니스·아홉, K탑스타 1위 등극 file 2025.06.23 217
380140 이슈 무려 70년전 태극기 달고 이슈된 아이돌 jpg file 2025.06.23 236
380139 먹거리 레몬즙 레몬수 30,900원/무배 file 2025.06.23 349
380138 강릉모아오픈! 2025.06.23 254
380137 잡담 얼굴 커버 2 2025.06.23 260
380136 밥먹고 3 2025.06.23 263
380135 잡담 전기자전거 배달 부업 시급이 올랐어요! file 2025.06.23 264
380134 기사/뉴스 카페 와서 커피 대신 바나나 시키고 '칸막이' 세운 역대급 빌런 / SBS / 뉴스딱 2 file 2025.06.23 258
380133 일반 Windows 95를 SSD에 설치하면 생기는 일 1 file 2025.06.23 249
380132 생활용품 국산 일회용 마스크 50매 1+1 file 2025.06.23 1749
380131 유머 말벌 아저씨 MZ버전 등장.jpg file 2025.06.23 271
380130 잡담 퇴사 결정되니까 3 2025.06.23 275
380129 유머 입던 속옷 제자에게 선물한 명장 안유성.jpg 1 file 2025.06.23 286
380128 유머 입던 속옷 제자에게 선물한 명장 안유성.jpg file 2025.06.23 258
380127 29도인데 왜 춥지? 3 2025.06.23 269
380126 아.. 1 2025.06.23 259
380125 화장품 라입 R3 아르간 헤어스타일링 오일 에센스 베리베리 100ml 2개 file 2025.06.23 1527
380124 점심시간! 2025.06.23 297
380123 화장품 메디솝 화이트닝 크림 50g 체험딜(300명) file 2025.06.23 1194
380122 점심시간 ㅃㄹㅃㄹ 2 2025.06.23 299
380121 생활용품 무빙큐빅스 스마트이동식 TV 32인치+거치대+3M연장케이블 199,000원 file 2025.06.23 330
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 12672 Next
/ 12672