/** * 넘겨받은 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 |