import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
#java에서 지원하는 ZipEntry, zipOutputStream 을 사용 하면 경로 내의 디렉토리명, 파일명에서 한글을 사용할경우 깨지는 현상이 발생.

jazzlib 라이브러리를 사용하면 한글깨짐 문제가 해결됩니다.
import net.sf.jazzlib.ZipEntry;
import net.sf.jazzlib.ZipOutputStream;

jazzlib 는 http://jazzlib.sourceforge.net 여기에서 다운로드 할수있습니다.
또는 아래에서 다운 하세요.

jar 파일 :
 
 

ZipEntry.java 변경일자 지정 버그 수정 파일(파일 압축시, 수정일자 출력안되거나 1970년대 출력 되는 증상)


아래 내용 출처 :
http://cafe.naver.com/itmecca.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1737

###################### ZipUtils.java ######################

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import net.sf.jazzlib.ZipEntry;
import net.sf.jazzlib.ZipInputStream;
import net.sf.jazzlib.ZipOutputStream;

/**
* FileName : ZipUtils.java
* Comment  : # 인자값 내용
   # createZipFile(압축할디렉토리위치, 저장될zip파일의 경로를 포함한파일명, 디렉토리 없을시 생성여부)
*/
public class ZipUtils {
    private static final byte[] buf = new byte[1024];
    
    /**
    * Comment  : 생성될 ZIP파일의 경로에 디렉토리가 없을경우 에러  발생
    */
    public static void createZipFile(String targetPath, String zipPath)throws Exception{
        createZipFile(targetPath, zipPath, false);
    }
    
    /**
    * Comment  : zip 파일을 생성.
    */
    public static void createZipFile(String targetPath, String zipPath, boolean isDirCre)throws Exception{
        File fTargetPath = new File(targetPath);
        File[] files = null;
        
        if(fTargetPath.isDirectory()){
            files = fTargetPath.listFiles();
        }else{
            files = new File[1];
            files[0] = fTargetPath;
        }
        
        File path = new File(zipPath);
        File dir = null;
        dir = new File(path.getParent());
        if(isDirCre){
            dir.mkdirs();
        }
        
        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(path));
        
        // zip 파일 압축
        makeZipFile(files, zipOut, "");
        
        // stream을 닫음으로서 zip 파일 생성
        zipOut.close();
        
    }
    
    
    /**
    * Comment  : # 일부 파일들을 배열로 설정하여 zip 파일 생성
    * ex) String[] arrZip = new String[]{"C:\\aaa.txt", "C:\\bbb.txt", "C:\\ccc.txt"}
    *     ZipUtils.createZipFile(arrZip, "C:\\test.zip");
    */
    public static void createZipFile(String[] targetFiles, String zipPath)throws Exception{
        createZipFile(targetFiles, zipPath, false);
    }
    
    /**
    * Comment  : # 일부 파일들을 배열로 설정하여 zip 파일 생성 (디렉토리 생성여부 선택)
    */
    public static void createZipFile(String[] targetFiles, String zipPath, boolean isDirCre)throws Exception{
        File[] files = new File[targetFiles.length];
        for(int i = 0; i < files.length; i++){
            files[i] = new File(targetFiles[i]);
        }
        
        File path = new File(zipPath);
        File dir = null;
        dir = new File(path.getParent());
        if(isDirCre){
            // 디렉토리가 없을경우 생성
            dir.mkdirs();
        }
        
        // zip 파일의 outputStream
        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(path));
        
        // zip 파일 압축
        makeZipFile(files, zipOut, "");
        
        // stream을 닫음으로서 zip 파일 생성
        zipOut.close();
    }
    
    
    /**
    * Comment  : zip 파일의 압축을 해제
    */
    public static void unZipFile(String targetZip, String completeDir)throws Exception{
        unZipFile(targetZip, completeDir, false);
    }    
    
    /**
    * Comment  :
    */
    public static void unZipFile(String targetZip, String completeDir, boolean isDirCre)throws Exception{
        ZipInputStream in = null;
        
        try{
            File fCompleteDir = null;
            fCompleteDir = new File(completeDir);
            if(isDirCre){
                // 디렉토리가 없을경우 생성
                fCompleteDir.mkdirs();
            }
            
            // zip 파일의 input stream을 읽어들임
            in = new ZipInputStream(new FileInputStream(targetZip));
            ZipEntry entry = null;
            
            // input stream내의 압축된 파일들을 하나씩 읽어들임.
            while((entry = in.getNextEntry()) != null){
                System.out.println("entry : " + entry);
                // zip 파일의 구조와 동일하게 가기위해 로컬의 디렉토리 구조를 만듬.
                String entryName = entry.getName();
                if(entry.getName().lastIndexOf("/") > 0){
                    String mkDirNm = entryName.substring(0, entryName.lastIndexOf("/"));
                    System.out.println("mkDirNm : " + mkDirNm);
                    new File(completeDir + mkDirNm).mkdirs();
                }
                // 해제할 각각 파일의 output stream을 생성
                FileOutputStream out = new FileOutputStream(completeDir + entry.getName());
                
                int bytes_read;
                while((bytes_read = in.read(buf)) != -1){
                    System.out.println("bytes_read : " + bytes_read);
                    out.write(buf, 0, bytes_read);
                }
                // 하나의 파일이 압축해제됨
                out.close();
            }
        }catch(Exception e){
            throw new Exception(e);
        }finally{
            // 모든 파일의 압축이 해제되면 input stream을 닫는다.
            in.close();
        }
    }
    
    // byte 배열을 받아서 압축된 byte배열을 리턴
    public static byte[] compressToZip(byte[] src)throws Exception{
        byte[] retSrc = null;
        ByteArrayOutputStream baos = null;
        
        try{
            // zip 파일의 output Stream
            ByteArrayInputStream bais = new ByteArrayInputStream(src);
            baos = new ByteArrayOutputStream();
            ZipOutputStream zos = new ZipOutputStream(baos) ;
            
            zos.putNextEntry(new ZipEntry("temp.tmp"));
            
            int bytes_read = 0;
            // 전달받은 src를 압축하여 파일에 씀
            while((bytes_read = bais.read(buf)) != -1){
                zos.write(buf, 0, bytes_read);
            }
            bais.close();
            zos.close();
            
            // 스트림을 닫은후 byte배열을 얻어옴
            retSrc = baos.toByteArray();
        }catch(Exception e){
            throw new Exception(e);
        }finally{
            baos.close();
        }
        
        return retSrc;
    }
    
    // 압축된 byte 배열을 받아서 zipPath위치에 zip 파일을 생성한다.
    private static void makeZipFile(byte[] src, String zipPath)throws Exception{
        FileOutputStream fos = null;
        ByteArrayInputStream bais = null;
        
        try{
            fos = new FileOutputStream(zipPath);
            bais = new ByteArrayInputStream(src);
            
            int bytes_read = 0;
            while((bytes_read = bais.read(buf)) != -1){
                fos.write(buf, 0, bytes_read);
            }
            
        }catch(Exception e){
            throw new Exception(e);
        }finally{
            fos.close();
            bais.close();
        }
    }
    
    // 압축된 byte 배열의 압축을 해제하여 byte배열로 리턴
    public static byte[] unZip(byte[] src)throws Exception{
        
        byte[] retSrc = null;
        ByteArrayOutputStream baos = null;
        ZipInputStream zis = null;
        int bytes_read = 0;
        
        try{
            zis = new ZipInputStream(new ByteArrayInputStream(src));
            baos = new ByteArrayOutputStream();
            
            zis.getNextEntry(); // entry는 하나밖에 없음을 보장
            while((bytes_read = zis.read(buf)) != -1){
                baos.write(buf, 0, bytes_read);
            }
            
            retSrc = baos.toByteArray();
        }catch(Exception e){
            throw new Exception(e);
        }finally{
            baos.close();
            zis.close();
        }
        
        return retSrc;
    }
    
    // 문자열을 압축하여 byte배열로 리턴(UTF-8)
    public static byte[] compressToZip(String src)throws Exception{
        return compressToZip(src.getBytes("UTF-8"));
    }
    
    // byte배열을 압축하여 zip 파일로 생성
    public static void srcToZipFile(byte[] src, String zipPath)throws Exception{
        byte[] retSrc = null;
        // 압축
        retSrc = compressToZip(src);
        
        // 파일로 만듬
        makeZipFile(retSrc, zipPath);
    }
    
    // byte 배열을 압축하여 zip 파일로 생성
    public static void srcToZipFile(String src, String zipPath)throws Exception{
        byte[] retSrc = null;
        
        // 압축
        retSrc = compressToZip(src.getBytes("UTF-8"));
        
        // 파일로 만듬
        makeZipFile(retSrc, zipPath);
    }
    
    // 압축된 zip파일을 해제후  byte배열로 리턴
    public static byte[] zipFileToSrc(String zipPath)throws Exception{
        byte[] retSrc = null;
        
        return retSrc;
    }
    
    public static void makeZipFile(File[] files, ZipOutputStream zipOut, String targetDir) throws Exception{
        for(int i = 0; i < files.length; i++){
            File compPath = new File(files[i].getPath());

            if(compPath.isDirectory()){
                File[] subFiles = compPath.listFiles();
                makeZipFile(subFiles, zipOut, targetDir+compPath.getName()+"/");
                continue;
            }

            FileInputStream in = new FileInputStream(compPath);
            zipOut.putNextEntry(new ZipEntry(targetDir+"/"+files[i].getName()));

            int data;

            while((data = in.read(buf)) > 0){
                zipOut.write(buf, 0, data);    
            }
            zipOut.closeEntry();
            in.close();
        }
    }
    
    public static void main(String[] arr) throws Exception{
        // 압축하기
        try {
            ZipUtils.createZipFile("D:\\02.TEMP\\backup2", "D:\\02.TEMP\\AAAA\\backup2_한글지원2.zip", true);
            //ZipUtils.unZipFile("D:\\02.TEMP\\backup2_aa.zip", "D:\\02.TEMP\\mkDirNm\\", true);
            
        /*
            // 문자열의 압축과 해제
            String str = "테스트333 데이터입니다.";
            byte[] src = str.getBytes("UTF-8");
            src = ZipUtils.compressToZip(src);
            byte[] retSrc = ZipUtils.unZip(src);
            System.out.println(new String(retSrc, "UTF-8"));
        */
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}
※ 위 내용은, 여러 자료를 참고하거나 제가 주관적으로 정리한 것입니다.
   잘못된 정보나 보완이 필요한 부분을, 댓글 또는 메일로 보내주시면 많은 도움이 되겠습니다.
04 14, 2010 18:29 04 14, 2010 18:29


Trackback URL : http://develop.sunshiny.co.kr/trackback/427

  1. # 쎄룽 2010年 11月 08日 19時 02分 Delete Reply

    잘보았습니다~ 퍼가두될까용?? ^^

    1. Re: # sunshiny 2010年 11月 12日 23時 46分 Delete

      에구.
      댓글 남기신걸 이제야 봤네요^^
      네~ 당연히 괜찮죠.
      저도 다른분이 정리해놓은거 가져온거 거든요.^^;
      글 남겨주셔서 고맙습니다^^

  2. # 자근앙마 2010年 12月 21日 18時 00分 Delete Reply

    감사합니다

    1. Re: # sunshiny 2010年 12月 21日 20時 37分 Delete

      네~
      글 남겨 주셔서 고맙습니다^^

  3. # 2011年 05月 31日 17時 26分 Delete Reply

    좋은 자료 감사합니다
    담아갑니다^^

    1. Re: # sunshiny 2011年 06月 02日 09時 11分 Delete

      네 고맙습니다^^

  4. # 열혈강군 2011年 07月 20日 13時 25分 Delete Reply

    좋은글이라 담아갑니다.~ ^^ 출처도 남겼습니다. 감사해요.

    1. Re: # sunshiny 2011年 07月 21日 11時 02分 Delete

      네~
      답글 고맙습니다^^

  5. # 삽질왕 2012年 06月 29日 19時 15分 Delete Reply

    안녕하세요 좋은글 가져갑니다..

    감사합니다.~^^

    1. Re: # sunshiny 2012年 07月 02日 08時 18分 Delete

      네, 고맙습니다^^

  6. # 팔팔청춘 2013年 03月 20日 22時 33分 Delete Reply

    좋은 정보 감사드립니다(__)

    1. Re: # sunshiny 2013年 03月 21日 21時 28分 Delete

      네, 댓글 고맙습니다^^

  7. # 한글만 입력가능... 2015年 02月 23日 16時 37分 Delete Reply

    좋은정보 감사합니다. 퍼가겠습니다.

    1. Re: # sunshiny 2015年 02月 23日 22時 08分 Delete

      네. 안녕하세요.^^
      글 남겨 주셔서 감사합니다.
      행복한 한해 되시길 바랄게요.^^

  8. # 자바초보신입개발자 2015年 04月 23日 15時 03分 Delete Reply

    해당 소스로 압축잘 되는것 확인하였는데.. 압축 프로그램(예를 들어 알집이나 반디집같은) 그런것을 지우고 폴더형태로 압축하였는데 압축한 파일안에가 비어있습니다.. 압축하려는 해당파일이 없어요.. 이건 어떻게 처리할 수 있는지.. 아무리 검색해도 이런경우는 없는거같은데 어떻게 된건지 모르겠습니다ㅠㅠ

    1. Re: # sunshiny 2015年 05月 10日 20時 02分 Delete

      안녕하세요.
      댓글이 늦어져서 죄송합니다.
      해당 증상에 대해서는 확인 했습니다.
      여유가 되는데로 저도 고민을 해보겠습니다.

  9. # 초보 2016年 01月 22日 17時 33分 Delete Reply

    집을 다운받을때 암호를 걸수 없나요?

    1. Re: # sunshiny 2016年 02月 06日 13時 20分 Delete

      안녕하세요.
      답변이 늦어져서 죄송합니다.
      저도 검색을 해봤는데, jazzlib에서는 암호를 설정하는 부분을 찾을수가 없네요.
      답변이 되지 못해서 아쉽습니다.
      새해 복 많이 받으세요.^^

  10. # 초보개발자 2016年 02月 17日 10時 20分 Delete Reply

    질문이 있습니다.
    jazzlib로 압축을 하고 알집 또는 반디집 국내용 압축 프로그램으로 압축을 해제 했을때의 문제가 있어서 조언좀 듣고자 합니다.

    알집으로 압축 해제를 할려고 목록을 열면 수정한 날짜가 1979-12-19 PM... 이런식으로 박혀 있구요 압축해제 하면 수정한 날짜가 표시 안되는 현상이 있는데 혹시 해당 문제를 알고 계신가요?

    1. Re: # sunshiny 2016年 02月 17日 18時 27分 Delete

      안녕하세요...

      ZipEntry에 버그가 있는것 같습니다.
      약간 수정해서 첨부해드린 ZipEntry.java 파일을 이용해서 실행해보시기 바랍니다.
      ZipEntry.java 파일을 net.sf.jazzlib 패키지를 만드신후에 넣어주세요.

      참고로...
      zip파일 생성시 기본, 생성일자로 되어있습니다.
      만약, 기존파일의 수정일자를 그대로 유지하고 싶다면 아래와 같이 zEnt.setTime() 함수로 읽어들인 파일의 수정일자를 지정해주세요.
      for(int i = 0; i < files.length; i++){
      File compPath = new File(files[i].getPath());
      ZipEntry zEnt = new ZipEntry(targetDir+"/"+files[i].getName());

      zEnt.setTime(files[i].lastModified()); // 기존 파일 수정일자 지정
      zipOut.putNextEntry(zEnt);

      남겨주신 댓글을 보고, 너무 오랜만에 java 소스를 보니 좀 당황스럽기도 했습니다.
      요즘은 java 소스를 볼일이 거의 없어서, java 관련 문의는 저도 답변하기가 어려울 수 있습니다.

  11. # /427 2020年 01月 23日 23時 16分 Delete Reply

    Wonderful site. A lot of useful info here. I'm sending it to
    several pals ans additionally sharing in delicious.

    And certainly, thanks on your sweat!

Leave a comment


Recent Posts

  1. HDFS - Python Encoding 오류 처리
  2. HP - Vertica ROS Container 관련 오류...
  3. HDFS - Hive 실행시 System Time 오류
  4. HP - Vertica 사용자 쿼리 이력 테이블...
  5. Client에서 HDFS 환경의 데이터 처리시...

Recent Comments

  1. Generally I do not read post on bl... 레기읏룸 셔츠룸 차이. 레깅스룸 부엉이 01 24,
  2. Wonderful site. A lot of useful in... /427 01 23,
  3. 안녕하세요^^ 배그핵
  4. 안녕하세요^^ 도움이 되셨다니, 저... sunshiny
  5. 정말 큰 도움이 되었습니다.. 감사합... 사랑은

Recent Trackbacks

  1. cabo packages cabo packages %M
  2. airbnb host insurance airbnb host insurance %M
  3. beaches in cabo beaches in cabo %M
  4. joe’s dj service joe’s dj service %M
  5. short term rental property insurance short term rental property insurance %M

Calendar

«   01 2020   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. 오라클 클럽
  4. API - Java
  5. Apache Hadoop API
  6. Apache Software Foundation
  7. HDFS 생태계 솔루션
  8. DNSBL - Spam Database Lookup
  9. Ready System
  10. Solaris Freeware
  11. Linux-Site
  12. 윈디하나의 솔라나라

Site Stats

TOTAL 2824938 HIT
TODAY 557 HIT
YESTERDAY 443 HIT