컴퓨터/노트북/인터넷
IT 컴퓨터 기기를 좋아하는 사람들의 모임방
🕰️
2014.06.24 15:05
자바 zip 파일로 압축 하는 소스
조회 수 1708 추천 수 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...");
}
}
컴퓨터/노트북/인터넷
IT 컴퓨터 기기를 좋아하는 사람들의 모임방
번호 | 분류 | 제목 | 조회 수 | 날짜 |
---|---|---|---|---|
공지 | 뉴스 |
구글 최신 뉴스
![]() |
1384 | 2024.12.12 |
공지 | 사랑LOVE 포인트 만렙! 도전 | 4608 | 2025.03.19 | |
공지 | 🚨(뉴비필독) 전체공지 & 포인트안내 2 | 25843 | 2024.11.04 | |
공지 | URL만 붙여넣으면 끝! 임베드 기능 | 20425 | 2025.01.21 | |
10639 | [이벤트] 2021 신축년 설날 제닉스 눈치게임 이벤트! | 26 | 2021.02.11 | |
10638 | [이벤트] ARENA-X 풋레스트 게이밍의자 캐치프레이즈 맞추기! | 29 | 2021.02.11 | |
10637 | 히타치 하드 포맷을 하려고 하는데요 2 | 1437 | 2014.06.13 | |
10636 | 희비 엇갈린 LG-SK…이제 공은 특허소송으로 | 22 | 2021.02.12 | |
10635 | 일반 | 희비 엇갈린 LG-SK…이제 공은 특허소송으로 | 97 | 2023.03.27 |
10634 | 일반 | 흠 윈도업뎃후 다운 | 96 | 2022.03.03 |
10633 | 일반 |
흠 윈도11 문제인가 크롬문제인가
![]() |
495 | 2022.03.29 |
10632 | 일반 | 흠 블투스피커 다 고장났네 | 86 | 2022.03.08 |
10631 | 일반 | 흙수저용 게이들을 위해서 좌식 컴퓨터 책상의자 뽑아봤다 1 | 164 | 2018.12.12 |
10630 | 일반 | 흑흑 결국 2테라 하드를 구해야 한다니 | 89 | 2022.02.10 |
10629 | 일반 | 흑자예상하며 기다린보람이 있군 | 471 | 2016.02.28 |
10628 | 일반 | 흐린 날씨에 7월 첫째 날이자 금요일이네요. | 542 | 2022.12.31 |
10627 | 정보 | 휴대폰에서 이상한 소리 (삐-삐-)가 납니다 | 3718 | 2021.11.29 |
10626 | 일반 | 휴대폰에서 이상한 소리 (삐-삐-)가 납니다 | 1531 | 2023.03.27 |
10625 | 정보 | 휴대폰성지 '좌표동맹' 아이폰12미니, 갤럭시노트20 핸드폰싸게사는법 시세표 공개 - 기호일보 | 778 | 2021.03.06 |
10624 | 일반 | 휴대폰 전체 다 그대로 다른 휴대폰으로 | 60 | 2022.01.01 |
10623 |
휴대폰 기종 뭔지 아시는 선생님 계실까요
1 ![]() |
389 | 2023.05.05 | |
10622 | 일반 | 휴대폰 교체시 문자 백업은 어떻게 하면 될까요? | 234 | 2022.02.21 |
10621 | 일반 | 휴대폰 교체시 문자 백업은 어떻게 하면 될까요? | 1587 | 2023.03.27 |
10620 | 일반 | 휴대용 컴프레셔 | 425 | 2022.12.31 |
10619 | 일반 |
휴대용 에어컨🆒대우 네오아미코 개봉기 [4K]
![]() |
84 | 2023.03.27 |
10618 | 정보 | 휴대성은 그램, 성능은 맥북… 가격은 둘다 고민되네 - 조선일보 | 749 | 2021.02.21 |
10617 | 일반 | 훌랄라 vs bhc 양념반 후라이드반 | 319 | 2022.03.09 |
10616 | 일반 | 훈수 듣고 성공한 bj | 552 | 2022.12.31 |
10615 | 일반 | 후쿠시마 앞바다에서 규모 7.2 지진 발생 | 548 | 2022.12.31 |
10614 | 일반 |
후 삿다......
![]() |
75 | 2022.02.14 |
10613 | 일반 |
효정님께
![]() |
78 | 2022.01.04 |
10612 | 일반 |
효도컴 이륙가능..?
![]() |
466 | 2022.04.12 |
10611 | 회원님들 파워렉스 REX III 600W Triple V2.3 요거 어떤가여 4 | 1592 | 2014.06.11 | |
10610 | 일반 | 회사에서 차를 지원해줘서!! | 70 | 2022.01.07 |