[java] zip 파일 압축풀기

프로그래밍/Java 2010. 9. 28. 20:07 Posted by galad
    /**
     * 넘겨받은 zip파일이 위치한 디렉토리에 zip 파일을 풀고, zip파일 내의 파일 목록(파일명)을 반환한다.
     * @param zipFilePath
     * @return zip파일에 들어있던 파일path 목록
     * @throws IOException
     */
    public static List<String> unzip(File file) throws IOException {

        List<String> fileList = new ArrayList<String>();

        // zip 파일 압축 해제
        ZipFile zipFile = new ZipFile(file,"EUC-KR");
        Enumeration entries = zipFile.getEntries();

        String zipFilePath = file.getPath();
        String orgDirPath = zipFilePath.substring(0, zipFilePath.lastIndexOf(File.separator));

        while(entries.hasMoreElements()) {

            ZipEntry zipEntry = (ZipEntry)entries.nextElement();
            String entryFileName = zipEntry.getName();

            System.out.println("File in Zip = " + entryFileName);

            if(zipEntry.isDirectory()) {
                (new File(orgDirPath + File.separator + entryFileName)).mkdir(); // 디렉토리 생성
                continue;
            }
            else {

                String[] tmpSplit = null; // 폴더 채로 압축하면, 폴더 내의 파일명은 [폴더명/폴더명/파일명] 이런 식으로 됨.

                try
                {
                    tmpSplit   = entryFileName.split(File.separator);
                }
                catch(Exception e)
                {
//                    tmpSplit = entryFileName.split("\\\\");
                    tmpSplit = entryFileName.split("/");
                }

                if(tmpSplit.length > 1)
                {
                    String tmpDir = "";
                    for(int j = 0; j < tmpSplit.length - 1; j++) // 파일이 여러 depth의 폴더 내에 있는 경우. 폴더/폴더/폴더/파일
                        tmpDir += (tmpSplit[j] + File.separator); // 상위의 모든 폴더명 붙이기

                    tmpDir = orgDirPath + File.separator + tmpDir; // zip 파일이 위치한 디렉토리에 압축된 디렉토리 생성

                    File tmpFile = new File(tmpDir);
                    if(!tmpFile.exists())
                        tmpFile.mkdir();
                }

                // 대상 파일
                String targetFilePath = orgDirPath + File.separator + entryFileName;

                // 파일 복사
                copyInputStream(zipFile.getInputStream(zipEntry), new BufferedOutputStream(new FileOutputStream(targetFilePath)));
//                System.out.println("FILE [" + entryFileName + "] COPIED TO " + orgDirPath);

                fileList.add(entryFileName);
            }
        }

        if(zipFile != null) // 열은 zip 파일 닫기
            zipFile.close();

        return fileList;
    }

    /**
     * 파일을 stream으로 읽어들여 대상 outputStream에 복사하는 메소드
     * @param in
     * @param out
     * @throws IOException
     */
    private 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();
    }


'프로그래밍 > Java' 카테고리의 다른 글

[zip] 압축하기2  (0) 2010.10.08
[zip] zip 압축하기/압축풀기  (0) 2010.10.08
[java] String, StringBuffer, StringBuilder  (0) 2010.09.28
[junit] 멀티스레드 테스트  (0) 2010.09.27
[jar] jar 압축하기/해제하기  (0) 2010.09.10