[java]ZipFile 사용시 한글 깨짐 문제...해결!!

Programming 2009.03.10 21:56
아놔. 오늘 하루죙일 이 문제로 싸웠네..
http://www.google.co.kr/search?hl=ko&lr=&client=firefox-a&rls=org.mozilla:ko:official&newwindow=1&q=java+Zip+%ED%95%9C%EA%B8%80+%ED%8C%8C%EC%9D%BC%EB%AA%85&start=10&sa=N

뭐 저런 쿼리로 구글링 아무리 열심히해도 누구는 jazzlib를 쓰라하고..
누군 ZipFileInputStream을 고치라하고..-_-;;
또 누구는 ant.jar에 있는 ZipFile을 쓰라한다.-_-;;

하지만 그 누구도 정확한 답을 주지 못했다.
온갖 난리를 치다 결국 얻은 교훈은....
API를 제일 먼저 보자!!!!

org.apache.tools.zip API(클릭)


쫌..ㅠㅠ;;
This class adds support for file name encodings other than UTF-8 (which is required to work on ZIP files created by native zip tools and is able to skip a preamble like the one found in self extracting archives. Furthermore it returns instances of org.apache.tools.zip.ZipEntry instead of java.util.zip.ZipEntry.

요렇게 친절하게 적어놨자나!!!
UTF-8이 적용되지 않은 파일 압축을 풀게 해주기 위해 저런 클래스를 만들었다고!
그리고...

Constructor Summary
ZipFile(java.io.File f)
          Opens the given file for reading, assuming the platform's native encoding for file names.
ZipFile(java.io.File f, java.lang.String encoding)
          Opens the given file for reading, assuming the specified encoding for file names.
ZipFile(java.lang.String name)
          Opens the given file for reading, assuming the platform's native encoding for file names.
ZipFile(java.lang.String name, java.lang.String encoding)
          Opens the given file for reading, assuming the specified encoding for file names.

생성시 인코딩을 설정해 줄 수 있자나.ㅠㅠ;

그래서 결국 나온 코드는...
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipException;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

public class ZipFileUtil {

    public static int unZip(String orgFileName, String orgDirName) {
        return ZipFileUtil.unZip(new File(orgDirName + File.separator + orgFileName));
    }


    @SuppressWarnings("unchecked")
    public static int unZip(File fileName) {
        Enumeration entries;
        ZipFile zipFile = null;

        try {
            zipFile = new ZipFile(fileName,"EUC-KR");   // 요거 한방이면 끝인데.ㅠㅠ;

            entries = zipFile.getEntries();

            while (entries.hasMoreElements()) {
                ZipEntry entry = (ZipEntry) entries.nextElement();
                String orgDirName = fileName.getParent() + File.separator;
                String entryFileName = entry.getName();
                if (entry.isDirectory()) {
                    System.err.println("Extracting directory: " + entryFileName);
                    (new File(orgDirName + entryFileName)).mkdir();
                    continue;
                } else {
                    String[] tmpSplit = entryFileName.split(File.separator);
                    if (tmpSplit.length > 1) {
                        String tmpDir = "";
                        for (int i = 0; i < tmpSplit.length - 1; i++)
                            tmpDir += (tmpSplit[i] + File.separator);
                        tmpDir = orgDirName + tmpDir;
                        File tmpFile = new File(tmpDir);
                        if (!tmpFile.exists())
                            tmpFile.mkdir();
                    }
                }
                System.out.println("Extracting File: " + entryFileName);

                FileUtil.copyInputStream(zipFile.getInputStream(entry),
                        new BufferedOutputStream(new FileOutputStream(
                                orgDirName + entryFileName)));
            }

        } catch (ZipException ze) {
            ze.printStackTrace();
            return 0;
        } catch (IOException ioe) {
            ioe.printStackTrace();
            return 0;
        } finally {
            try {
                if (zipFile != null)
                    zipFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return 1;
    }

}


import java.io.*;
public class FileUtil {
   
     /**
     * 파일을 stream으로 읽어들여 대상 outputStream에 복사하는 메소드
     * @param in
     * @param out
     * @throws IOException
     */
    public static final void copyInputStream(InputStream in, OutputStream out)
            throws IOException {
        byte[] buffer = new byte[1024];
        int len;

        while ((len = in.read(buffer)) >= 0)
            out.write(buffer, 0, len);

        in.close();
        out.close();
    }
}


정말 허무한 고생했다.ㅠㅠ;

저작자 표시 비영리 변경 금지
신고


티스토리 툴바