본문 바로가기

백앤드/Java

[JAVA] 파일 압축 / apache 라이브러리 사용

반응형

Apache file compress Download

(아파치 라이브러리를 사용한 파일 압축)

위 파란글씨를 통해 다운받는 공식 홈페이지로 이동합니다.

 

소스에도 주석을 달아놔서 블로그에 자세한 설명을 적지않아도 왠만한 개발자면 이해가 되실거라고 믿습니다.

 

이 소스를 자바 프로젝트에서 사용한다면 util 패키지 내부에 compress 클래스에 넣어놓고 재활용해서 사용하는게 좋겠죠 !

 

 

그럼 어차피 위에 글은 안읽어보고 소스만 복사+붙여넣기 하시겠지만

소스 공개합니다 !

 

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;

import java.io.*;

/**
 * 본 클래스는 압축하는데 필요한 소스이며, 압축과 압축해제를 동시에 다루는 클래스이다.
 * @author jskang
 */
public class Compress {
	private String[] fileList = null;
	int SIZE = 1024;

	/**
	 * 압축 메소드
	 * @param dirPath 압축할 파일이 모여있는 디렉토리 경로 (디렉토리안에있는 모든 파일 및 디렉토리를 압축함)
	 * @param outPath 압축파일을 생성할 디렉토리 경로
	 * @author jskang
	 */
	public void compress(String dirPath, String outPath){
		File file = new File(dirPath);
		if(!file.isDirectory()) {
			System.out.println("It is not directory.");
			return;
		} else if(file == null){
			System.out.println("File not found.");
			return;
		}

		fileList = file.list();
		byte[] buf = new byte[SIZE];
		String outCompressName = outPath+ "/compress.zip";

		FileInputStream fis = null;
		ZipArchiveOutputStream zos = null;
		BufferedInputStream bis = null;

		try {
			// Zip 파일생성
			zos = new ZipArchiveOutputStream(new BufferedOutputStream(new FileOutputStream(outCompressName)));
			for( int i=0; i < fileList.length; i++ ){
				//해당 폴더안에 다른 폴더가 있다면 지나간다.
				if( new File(dirPath+"/"+fileList[i]).isDirectory() ){
					continue;
				}
				//encoding 설정
				zos.setEncoding("UTF-8");

				//buffer에 해당파일의 stream을 입력한다.
				fis = new FileInputStream(dirPath + "/" + fileList[i]);
				bis = new BufferedInputStream(fis,SIZE);

				//zip에 넣을 다음 entry 를 가져온다.
				zos.putArchiveEntry(new ZipArchiveEntry(fileList[i]));

				//준비된 버퍼에서 집출력스트림으로 write 한다.
				int len;
				while((len = bis.read(buf,0,SIZE)) != -1){
					zos.write(buf,0,len);
				}

				bis.close();
				fis.close();
				zos.closeArchiveEntry();

			}
			zos.close();

		} catch(IOException e){
			e.printStackTrace();
		} finally{
			try {
				if (zos != null) {
					zos.close();
				}
				if (fis != null) {
					fis.close();
				}
				if (bis != null) {
					bis.close();
				}
			} catch(IOException e){
				e.printStackTrace();
			}
		}
	}
}

 

 

 

 

반응형