Post
KO

java 압축 풀기.

java 압축 풀기.

java 합축 풀기

출처 : http://yeon97.egloos.com/1551569

아주 잘 정리되어 퍼옴

java zip압축 하기/풀기

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream;

import org.apache.commons.lang.StringUtils;

public class ZipUtils {

    private static final int COMPRESSION_LEVEL = 8;

    private static final int BUFFER_SIZE = 1024 * 2;

    /**       지정된 폴더를 Zip 파일로 압축한다.       @param sourcePath - 압축 대상 디렉토리       @param output - 저장 zip 파일 이름       @throws Exception      */     public static void zip(String sourcePath, String output) throws Exception {

        // 압축 대상(sourcePath)이 디렉토리나 파일이 아니면 리턴한다.         File sourceFile = new File(sourcePath);         if (!sourceFile.isFile() && !sourceFile.isDirectory()) {             throw new Exception(“압축 대상의 파일을 찾을 수가 없습니다.”);         }

        // output 의 확장자가 zip이 아니면 리턴한다.         if (!(StringUtils.substringAfterLast(output, ”.”)).equalsIgnoreCase(“zip”)) {             throw new Exception(“압축 후 저장 파일명의 확장자를 확인하세요”);         }

        FileOutputStream fos = null;         BufferedOutputStream bos = null;         ZipOutputStream zos = null;

        try {             fos = new FileOutputStream(output); // FileOutputStream             bos = new BufferedOutputStream(fos); // BufferedStream             zos = new ZipOutputStream(bos); // ZipOutputStream             zos.setLevel(COMPRESSION_LEVEL); // 압축 레벨 - 최대 압축률은 9, 디폴트 8             zipEntry(sourceFile, sourcePath, zos); // Zip 파일 생성             zos.finish(); // ZipOutputStream finish         } finally {             if (zos != null) {                 zos.close();             }             if (bos != null) {                 bos.close();             }             if (fos != null) {                 fos.close();             }         }     }

    /**       압축       @param sourceFile       @param sourcePath       @param zos       @throws Exception      /     private static void zipEntry(File sourceFile, String sourcePath, ZipOutputStream zos) throws Exception {         // sourceFile 이 디렉토리인 경우 하위 파일 리스트 가져와 재귀호출         if (sourceFile.isDirectory()) {             if (sourceFile.getName().equalsIgnoreCase(“.metadata”)) { // .metadata 디렉토리 return                 return;             }             File[] fileArray = sourceFile.listFiles(); // sourceFile 의 하위 파일 리스트             for (int i = 0; i < fileArray.length; i++) {                 zipEntry(fileArray[i], sourcePath, zos); // 재귀 호출             }         } else { // sourcehFile 이 디렉토리가 아닌 경우             BufferedInputStream bis = null;             try {                 String sFilePath = sourceFile.getPath();                 String zipEntryName = sFilePath.substring(sourcePath.length() + 1, sFilePath.length());

                bis = new BufferedInputStream(new FileInputStream(sourceFile));                 ZipEntry zentry = new ZipEntry(zipEntryName);                 zentry.setTime(sourceFile.lastModified());                 zos.putNextEntry(zentry);

                byte[] buffer = new byte[BUFFER_SIZE];                 int cnt = 0;                 while ((cnt = bis.read(buffer, 0, BUFFER_SIZE)) != -1) {                     zos.write(buffer, 0, cnt);                 }                 zos.closeEntry();             } finally {                 if (bis != null) {                     bis.close();                 }             }         }     }

    /**       Zip 파일의 압축을 푼다.             @param zipFile - 압축 풀 Zip 파일       @param targetDir - 압축 푼 파일이 들어간 디렉토리       @param fileNameToLowerCase - 파일명을 소문자로 바꿀지 여부       @throws Exception      */     public static void unzip(File zipFile, File targetDir, boolean fileNameToLowerCase) throws Exception {         FileInputStream fis = null;         ZipInputStream zis = null;         ZipEntry zentry = null;

        try {             fis = new FileInputStream(zipFile); // FileInputStream             zis = new ZipInputStream(fis); // ZipInputStream

            while ((zentry = zis.getNextEntry()) != null) {                 String fileNameToUnzip = zentry.getName();                 if (fileNameToLowerCase) { // fileName toLowerCase                     fileNameToUnzip = fileNameToUnzip.toLowerCase();                 }

                File targetFile = new File(targetDir, fileNameToUnzip);

                if (zentry.isDirectory()) {// Directory 인 경우                     FileUtils.makeDir(targetFile.getAbsolutePath()); // 디렉토리 생성                 } else { // File 인 경우                     // parent Directory 생성                     FileUtils.makeDir(targetFile.getParent());                     unzipEntry(zis, targetFile);                 }             }         } finally {             if (zis != null) {                 zis.close();             }             if (fis != null) {                 fis.close();             }         }     }

    /**       Zip 파일의 한 개 엔트리의 압축을 푼다.             @param zis - Zip Input Stream       @param filePath - 압축 풀린 파일의 경로       @return       @throws Exception      */     protected static File unzipEntry(ZipInputStream zis, File targetFile) throws Exception {         FileOutputStream fos = null;         try {             fos = new FileOutputStream(targetFile);

            byte[] buffer = new byte[BUFFER_SIZE];             int len = 0;             while ((len = zis.read(buffer)) != -1) {                 fos.write(buffer, 0, len);             }         } finally {             if (fos != null) {                 fos.close();             }         }         return targetFile;     } }

위의 소스는 문제점이 있다. 사실 소스문제라기 보다는 java.util.zip 문제이다. zip 파일안의 파일명의 인코딩을 UTF-8 로 하기 때문에 압축 대상 파일명에 한글이 있을경우 문제가 생긴다. 만약 압축 대상 파일명에 한글이 포함되어 있다면 jazzlib 를 사용하기 바란다.

jazzlib 는 java.util.zip 과 구조 및 사용법이 똑같으므로 위의 소스에서 ZipEntry, ZipOutputStream 의 import 문만 변경하여 주면 된다.

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

This article is licensed under CC BY 4.0 by the author.