본문 바로가기
Back-end/JAVA & Spring

[Java] 자바 zip 압축 풀기 ( 파일 , 폴더 압축 풀기)

by 꼬바리 2021. 5. 28.

# 자바로 zip 파일 압축 풀기.

 

    - 폴더 안에 파일과, 하위 폴더 압축해버리기. 

 

    - 아래의 ZIP 파일 압축 풀기.

 

 


# UnZip.java - ZIP 파일 압축 풀기

package zipUtil;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnZip {
	/**
	 * 압축풀기 메소드
	 * 
	 * @param zipFileName 압축파일
	 * @param directory   압축 풀 폴더
	 */
	public boolean unZip(String zipPath, String zipFileName, String zipUnzipPath) {

		// 파일 정상적으로 압축이 해제가 되어는가.
		boolean isChk = false;

		// 해제할 홀더 위치를 재조정
		zipUnzipPath = zipUnzipPath + zipFileName.replace(".zip", "");

		// zip 파일
		File zipFile = new File(zipPath + zipFileName);

		FileInputStream fis = null;
		ZipInputStream zis = null;
		ZipEntry zipentry = null;

		try {
			// zipFileName을 통해서 폴더 만들기
			if (makeFolder(zipUnzipPath)) {
				System.out.println("폴더를 생성했습니다");
			}

			// 파일 스트림
			fis = new FileInputStream(zipFile);

			// Zip 파일 스트림
			zis = new ZipInputStream(fis, Charset.forName("EUC-KR"));

			// 압축되어 있는 ZIP 파일의 목록 조회
			while ((zipentry = zis.getNextEntry()) != null) {
				String filename = zipentry.getName();
				System.out.println("filename(zipentry.getName()) => " + filename);
				File file = new File(zipUnzipPath, filename);

				// entiry가 폴더면 폴더 생성
				if (zipentry.isDirectory()) {
					System.out.println("zipentry가 디렉토리입니다.");
					file.mkdirs();
				} else {
					// 파일이면 파일 만들기
					System.out.println("zipentry가 파일입니다.");
					try {
						createFile(file, zis);
					} catch (Throwable e) {
						e.printStackTrace();
					}
				}
			}
			isChk = true;
		} catch (Exception e) {
			isChk = false;
		} finally {
			if (zis != null) {
				try {
					zis.close();
				} catch (IOException e) {
				}
			}
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
				}
			}
		}
		return isChk;
	}
	//코드가 길어서 분리했습니다. 아래 2개 메소드 가 여기 위치해야합니다.
}

makeFolder() , createFile() 메소드 분리 (코드가 너무 길어서..)

/**
 * @param folder - 생성할 폴더 경로와 이름
 */
private boolean makeFolder(String folder) {
	if (folder.length() < 0) {
		return false;
	}
	String path = folder; // 폴더 경로
	File Folder = new File(path);
	// 해당 디렉토리가 없을경우 디렉토리를 생성합니다.
	if (!Folder.exists()) {
		try {
			Folder.mkdir(); // 폴더 생성합니다.
			System.out.println("폴더가 생성되었습니다.");
		} catch (Exception e) {
			e.getStackTrace();
		}
	} else {
		System.out.println("이미 폴더가 생성되어 있습니다.");
	}
	return true;
}
/**
 * 파일 만들기 메소드
 *
 * @param file 파일
 * @param zis  Zip스트림
 */
private void createFile(File file, ZipInputStream zis) throws Throwable {
	// 디렉토리 확인
	File parentDir = new File(file.getParent());
	// 디렉토리가 없으면 생성하자
	if (!parentDir.exists()) {
		parentDir.mkdirs();
	}
	FileOutputStream fos = null;
	// 파일 스트림 선언
	try {
		fos = new FileOutputStream(file);
		byte[] buffer = new byte[256];
		int size = 0;
		// Zip스트림으로부터 byte뽑아내기
		while ((size = zis.read(buffer)) > 0) {
			// byte로 파일 만들기
			fos.write(buffer, 0, size);
		}
	} catch (Throwable e) {
		throw e;
	} finally {
		if (fos != null) {
			try {
				fos.close();
			} catch (IOException e) {
			}
		}
	}
}

 

# Main.java - ZIP 파일 압축 풀기

//import zipUtil.CompressZip;
import zipUtil.UnZip;

public class Main {
	public static void main(String[] args) {

		// 압축 파일 위치와 압축된 파일
		 String zipPath = "G:/ZIP_TEST/";
		 String zipFile = "jsmpeg-player-master.zip";

		// 압축을 해제할 위치, 압축할 파일이름
		String unZipPath = "G:/ZIP_TEST/TEST/";
		String unZipFile = "jsmpeg-player";

		System.out.println("--------- 압축 해제 ---------");
		UnZip unZip = new UnZip();
		
		// 압축 해제 
		if (!unZip.unZip(zipPath, zipFile, unZipPath)) {
			System.out.println("압축 해제 실패");
		}
/*
		System.out.println("--------- 압축 하기 ---------");
		CompressZip compressZip = new CompressZip();

		// 압축 하기
		try {
			if (!compressZip.compress("G:/ZIP_TEST/TEST/jsmpeg-player-master", unZipPath, unZipFile)) {
				System.out.println("압축 실패");
			}
		} catch (Throwable e) {
			e.printStackTrace();
		}
*/
	}
}

# 결과화면

더보기



출처: https://minaminaworld.tistory.com/132 [미나미 블로그]

728x90
반응형

댓글