본문 바로가기

개발/Java

[JAVA/자바] 파일압축하기 ( jazzlib, apache.commons.compress )


프로젝트중 갑자기 여러파일을 압축해서 내려받게 해달라는 요청이 들어와 

여기저기 사이트를 돌아다니며 얻은 정보를 정리하여 올린다.


파일 압축은 JAVA에서도 java.utril.zip API 를 지원하지만 한글지원이 안된다고 하여 인터넷으로 검색중

제일 많이 보이는 jazzlib 을 먼저 사용해 보았다.


하지만 예상과 달리 압축은 잘되는데 한글이름의 파일은 한글이 깨져서 압축이되었다.

내가 사용을 잘못한건지. 뭔가 문제인지 모르는상태에서 급해서 아파치에서 지원하는 

apache.commons.compress 를 사용해보았다. 이번에는 한글파일이 깨지지 않는다. 


정리하면 


zazzlib = 한글깨짐

apache.commons.compress = 한글안깨짐 


일단 두가지 모두 써볼수 있도록 소스를 올려놓았다.

zazzlib 받는곳 

http://jazzlib.sourceforge.net/


apache.commons.compress  받는곳 

https://commons.apache.org/proper/commons-compress/download_compress.cgi


두가지 사용법은 크기 다르지 않다.


( jazzlib )

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import net.sf.jazzlib.ZipEntry;
import net.sf.jazzlib.ZipOutputStream;

public class SampleProject {

	public static void main(String[] args) throws IOException {
		
		String path = "C:\\Users\\Administrator\\Desktop\\test";
		File file = new File(path);
		String files[] = null;

		//파일이 디렉토리 일경우 리스트를 읽어오고
		//파일이 디렉토리가 아니면 첫번째 배열에 파일이름을 넣는다.
		if( file.isDirectory() ){
			files = file.list();
		}else{
			files = new String[1];
			files[0] = file.getName();
			System.out.println(file.getName().getBytes());
		}
		
		
		//buffer size
		int size = 1024;
		byte[] buf = new byte[size];
		String outZipNm = path+"\\테스트.zip";
		
		FileInputStream fis = null;
		ZipOutputStream zos = null;
		BufferedInputStream bis = null;
	
		try{
			// Zip 파일생성
			zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(outZipNm)));
			for( int i=0; i < files.length; i++ ){
				
				//buffer에 해당파일의 stream을 입력한다.  
				fis = new FileInputStream(path + "/" + files[i]);
				bis = new BufferedInputStream(fis,size);
				
				//zip에 넣을 다음 entry 를 가져온다.
				zos.putNextEntry( new ZipEntry(files[i]) );
				
				//압출레벨을 설정한다.
				//기본값은 8이라고 한다. 최대는 9이다.
				final int COMPRESSION_LEVEL = 8;
	            zos.setLevel(COMPRESSION_LEVEL);
	            
	            //준비된 버퍼에서 집출력스트림으로 write 한다.
				int len;
				while((len = bis.read(buf,0,size)) != -1){
					zos.write(buf,0,len);
				}
				zos.closeEntry();
				bis.close();
				fis.close();
				
			}
			zos.close();
		}catch(Exception e){
			e.printStackTrace();
		}

	}

}




( apache.commons.compress )

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

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

public class SampleProject {

	public static void main(String[] args) throws IOException {
		
		String path = "C:\\Users\\Administrator\\Desktop\\test";
		File file = new File(path);
		String files[] = null;

		//파일이 디렉토리 일경우 리스트를 읽어오고
		//파일이 디렉토리가 아니면 첫번째 배열에 파일이름을 넣는다.
		if( file.isDirectory() ){
			files = file.list();
		}else{
			files = new String[1];
			files[0] = file.getName();
			System.out.println(file.getName().getBytes());
		}
		
		
		//buffer size
		int size = 1024;
		byte[] buf = new byte[size];
		String outZipNm = path+"\\테스트.zip";
		
		FileInputStream fis = null;
		ZipArchiveOutputStream zos = null;
		BufferedInputStream bis = null;
		
		try {
			// Zip 파일생성
			zos = new ZipArchiveOutputStream(new BufferedOutputStream(new FileOutputStream(outZipNm)));
			
			for( int i=0; i < files.length; i++ ){
				
				//해당 폴더안에 다른 폴더가 있다면 지나간다.
				if( new File(path+"/"+files[i]).isDirectory() ){
					continue;
				}
				
				//encoding 설정
				zos.setEncoding("UTF-8");
				
				//buffer에 해당파일의 stream을 입력한다.
				fis = new FileInputStream(path + "/" + files[i]);
				bis = new BufferedInputStream(fis,size);
				
				//zip에 넣을 다음 entry 를 가져온다.
				zos.putArchiveEntry(new ZipArchiveEntry(files[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 (FileNotFoundException e) {
			e.printStackTrace();
		}finally{
			if( zos != null ){
				zos.close();
			}
			
			if( fis != null ){
				fis.close();
			}
			
			if( bis != null ){
				bis.close();
			}
		}
    }
}

( apache.commons.compress ) 하위폴더 압축 포함 

package testProject;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

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


public class test {
	
	static final String ZIP_NM = "테스트.zip";
	static final String ZIP_PATH = "C:\\Users\\sos89\\Desktop\\test";
	
	public static void main(String[]args) throws IOException{
		
        File dir = new File(ZIP_PATH);
        File file = null;
        String files[] = null;
 
        //파일이 디렉토리 일경우 리스트를 읽어오고
        //파일이 디렉토리가 아니면 첫번째 배열에 파일이름을 넣는다.
        if( dir.isDirectory() ){
            files = dir.list();
        }else{
            files = new String[1];
            files[0] = dir.getName();
        }

        ZipArchiveOutputStream zos = null;
         
        try {
            // Zip 파일생성
            zos = new ZipArchiveOutputStream(new BufferedOutputStream(new FileOutputStream(ZIP_PATH+"/"+ZIP_NM)));
             
            for( int i=0; i < files.length; i++ ){
            	file = new File(ZIP_PATH+"/"+files[i]);
            	zip("",file,zos);
  
            }
            zos.close();
 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally{
            if( zos != null ){
                zos.close();
            }
        }

	} 
	
	
	//압축파일에 파일작성
	public static void zip(String parent, File file, ZipArchiveOutputStream zos) throws IOException{
		
		FileInputStream fis = null;
		BufferedInputStream bis = null;
		
        //buffer size
        int size = 1024;
        byte[] buf = new byte[size];
        
        if( !file.exists() ){
        	System.out.println(file.getName()+" : 파일없음");
        }
		
		//해당 폴더안에 다른 폴더가 재귀호출 
        if( file.isDirectory() ){
        	
            String dirName = file.getPath().replace(ZIP_PATH, "");
            String parentName = dirName.substring(1)+"\\";
            dirName = dirName.substring(1,dirName.length() - file.getName().length());
            ZipArchiveEntry entry = new ZipArchiveEntry(dirName+file.getName()+"\\");
            zos.putArchiveEntry(entry);
            String[] files = file.list();
            for( int i=0; i<files.length; i++ ){
            	zip(parentName,new File(file.getPath()+"\\"+files[i]),zos);
            } 
    
        }else{
        	 //encoding 설정
            zos.setEncoding("UTF-8");
             
            //buffer에 해당파일의 stream을 입력한다.
            //System.out.println(file.getPath());
            fis = new FileInputStream(file);
            bis = new BufferedInputStream(fis,size);
             
           
            //zip에 넣을 다음 entry 를 가져온다.
            ZipArchiveEntry entry = new ZipArchiveEntry(parent+file.getName());
            zos.putArchiveEntry(entry);
             
             
            //준비된 버퍼에서 집출력스트림으로 write 한다.
            int len;
            while((len = bis.read(buf,0,size)) != -1){
                zos.write(buf,0,len);
            }
             
            bis.close();
            fis.close();
            zos.closeArchiveEntry();
        }
	}
}