본문 바로가기

컴퓨터/노트북/인터넷

IT 컴퓨터 기기를 좋아하는 사람들의 모임방

조회 수 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...");
    }
}

컴퓨터/노트북/인터넷

IT 컴퓨터 기기를 좋아하는 사람들의 모임방

List of Articles
번호 분류 제목 조회 수 날짜
공지 뉴스 구글 최신 뉴스 file 1456 2024.12.12
HOT글 일반 샤오미 BE6500 라우터 실사용 후기 (Wi-Fi 7 + 2.5G 스위치 기능까지 ㄷㄷ) 4 1022 2025.06.28
공지 🚨(뉴비필독) 전체공지 & 포인트안내 22 29003 2024.11.04
공지 URL만 붙여넣으면 끝! 임베드 기능 23086 2025.01.21
10641 네이버 지식쇼핑을 보면 깜놀랄일 3952 2014.03.23
10640 mysql 6.0 다운로드 (windows 계열 32비트용) 2786 2014.03.29
10639 리니지 프리서버 - 춘자 2.7클라이언트 2 9506 2014.03.30
10638 안녕하세요 1925 2014.04.07
10637 가입했습니당^.^ 1 2189 2014.04.07
10636 가입인사드립니다. 1 2124 2014.04.07
10635 스위트망고입니다. 반갑습니다 1 2196 2014.04.07
10634 영자님 2 4002 2014.04.11
10633 카오스원 2 3277 2014.04.11
10632 컴퓨터 포멧하려는데 BIOS 화면이 안떠요. 6 5186 2014.04.12
10631 하이하이 1 4142 2014.04.12
10630 영자씨 1 2622 2014.04.13
10629 인텔 v프로 원격제어 지원 메인보드-애즈락 Q87M 프로 출시 2850 2014.04.26
10628 하즈웰 4세대 오버클럭시 온도차이. 2379 2014.04.26
10627 갠적으로 마음에 드는 그래픽카드 GTX760 PHANTOM DDR5 2G 1 2843 2014.04.26
10626 탑파워 TOPOWER TOP-500D 80PLUS Bronze 1943 2014.04.26
10625 슈퍼플라워 SF-500P12A 후기 1711 2014.04.26
10624 인텔 코어 i7 하스웰 4770 추천드림 2424 2014.04.26
10623 듀얼 모니터 작업표시줄 프로그램 2976 2014.04.26
10622 일반하드랑 ssd랑 차이가 심한가요? 1 3035 2014.04.26
10621 로지텍 Gaming Mouse G100 쓰다보니 2200 2014.04.26
10620 AMD FX 8300 비쉐라는 인텔 cpu 어느것과 동급인가요? 1 4270 2014.04.26
10619 인텔 G3220 하스웰- 부모님 조립해드렸어요 2422 2014.04.26
10618 인텔 제온 E3-1230V3, 제온짝퉁이라니? 2633 2014.04.26
10617 ipTIME Extender2 무선공유기 wifi 확장써보니...안습 2324 2014.04.26
10616 안철수 v3백신도 좋지만, avast가 더 좋은것 같아요 2489 2014.04.27
10615 컴퓨터가 아무래도 연차가 있다보니.. 1 3410 2014.04.27
10614 그외 컴퓨터 온도측정 프로그램 hwmonitor 3777 2014.04.28
10613 이용하는 사람이 별로 없나바요. 3 3510 2014.04.28
10612 안녕하세요^^ 이번에 PC 새로 맞추려는데 1 2336 2014.04.28
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 355 Next
/ 355