🕰️
2014.06.24 15:05
자바 zip 파일로 압축 하는 소스
조회 수 1710 추천 수 0 댓글 0
import system.log.Logger;
import system.exception.Exception;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
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;
* 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;
// 압축할 폴더를 설정한다.
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;
**********************************************************************************
* 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());
********************************************
* 압축할 폴더명을 얻는다. : 절대 경로가 넘어올 경우 --> 상대경로로 변경한다...
*********************************************/
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();
**************************************************************************
* 폴더인지 파일인지 확인한다...
* 만약 넘겨받은 인자가 파일이면 그 파일의 상위 디렉토리를 타겟으로 하여 압축한다.
*****************************************************************************/
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;
*****************************************************************
* 압축할 파일 이름을 정한다.
* 압축할 파일 명이 존재한다면 다른 이름으로 파일명을 생성한다.
*****************************************************************/
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);
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...");
}
}
****************************************************************
* 압축 레벨을 정하는것인데 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...");
}
}
번호 | 분류 | 제목 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | 유머 | 🚨(뉴비필독) 전체공지 & 포인트안내 12 | 2024.11.04 | 26956 |
공지 | 이슈 | URL만 붙여넣으면 끝! 임베드 기능 | 2025.01.21 | 21273 |
380192 | 의류 |
네이버 1+1 강아지옷 메쉬 농구옷 50%할인한다 5500원 무배
1 ![]() ![]() |
2025.06.24 | 80 |
380191 | 잡담 |
전체적인 여드름관리
1 ![]() |
2025.06.24 | 83 |
380190 | 의류 |
[네이버] 1+1 드라이 기능성 긴바지 20,000원 배송비 3,000원
![]() ![]() |
2025.06.24 | 92 |
380189 | 생활용품 |
시크릿데이 입는 오버나이트 무료이벤트
![]() ![]() |
2025.06.24 | 99 |
380188 |
이제 저녁시간인데
![]() |
2025.06.24 | 96 | |
380187 |
영어나 외국어를 교재와 MP3파일로 공부할 때 어플과 AI도구를 이용해 공부 효율을 올리는 꿀 팁
![]() ![]() |
2025.06.24 | 101 | |
380186 |
CU편의점 택배 보낼일 있으면 참고해!
1 ![]() |
2025.06.24 | 142 | |
380185 | 기사/뉴스 |
"와 천잰데?" 놀라운 기술…'댓글 부대' 싹 잡아낸다
3 ![]() ![]() |
2025.06.24 | 115 |
380184 | 유머 |
썸남이 연애 못 해본 거 티난다는 안전벨트 해주는 방법
![]() ![]() |
2025.06.24 | 112 |
380183 |
오늘 비오는거 맞아??
1 ![]() |
2025.06.24 | 111 | |
380182 | 그 외 |
이브원더즈 암튜브 성인용 팔튜브 암링 남성, 2개 7,440원/무배
![]() ![]() |
2025.06.24 | 1742 |
380181 | 잡담 |
얼굴 작아지는 법 뭐가있을까
![]() |
2025.06.24 | 107 |
380180 | 먹거리 |
홈플러스 이번주 특가 행사 전단지 (6.26~7.2)
![]() ![]() |
2025.06.24 | 172 |
380179 | 기사/뉴스 |
올데이 프로젝트, 데뷔와 동시에 멜론 '톱100' 직행 '돌풍'
![]() ![]() |
2025.06.24 | 134 |
380178 | 화장품 |
토니모리 겟잇틴트 버터틴트 4,800원!
![]() ![]() |
2025.06.24 | 252 |
380177 | 이용권/상품권 |
쿠팡이츠 랜덤 쿠폰 1천원~최대 5만원 100% 당첨 (선착순)
1 ![]() ![]() |
2025.06.24 | 155 |
380176 | 먹거리 |
[네이버] L아르기닌 6000 고함량 15포*3개 (27,900원/무료)
![]() ![]() |
2025.06.24 | 140 |
380175 | 기사/뉴스 |
헌법 강의하다 "문재인은 간첩"‥"강의의 자유"
1 ![]() ![]() |
2025.06.24 | 142 |
380174 | 날씨 왜이래 1 | 2025.06.24 | 117 | |
380173 | 제습기 가동 2 | 2025.06.24 | 138 | |
380172 | 제습기 필요성 2 | 2025.06.24 | 132 | |
380171 | 유머 |
인스타 릴스 알고리즘 뜬 트리플에스 소속사 남돌.jpg
![]() |
2025.06.24 | 147 |
380170 | 유머 |
이병헌 때문에 이민정이랑 단 둘이 남게 된 김우빈.jpg
![]() |
2025.06.24 | 164 |
380169 |
방송대커뮤니티 홍보용 - geminin
![]() ![]() |
2025.06.24 | 173 | |
380168 |
방송대 학과 게시판 주소
![]() |
2025.06.24 | 179 | |
380167 | 먹거리 |
롯데온 세븐일레븐 아이스 아메리카노 레귤러 450원
![]() |
2025.06.24 | 191 |
380166 | 기사/뉴스 |
누군가를 사랑하는 사람을 보면 그 사람을 잘 알 수 있다. 인생에서 중요한 과제는 과거의 나를 용서하고 받아들이는 것이다.
![]() |
2025.06.24 | 189 |
380165 | 유머 |
요즘 현대인들이 가장 많이 고민하는 부분? 시간, 돈, 나이에 얽혀 사는 한국인들의 문제점
![]() |
2025.06.24 | 175 |
380164 | 맛잇는 냄새 | 2025.06.24 | 171 | |
380163 | 다들 점심 뭐 먹어? | 2025.06.24 | 173 |