프로젝트중 갑자기 여러파일을 압축해서 내려받게 해달라는 요청이 들어와
여기저기 사이트를 돌아다니며 얻은 정보를 정리하여 올린다.
파일 압축은 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(); } } }
'개발 > Java' 카테고리의 다른 글
[JAVA/자바] Jad Decompiler 설치 및 사용 (0) | 2017.04.11 |
---|---|
[JAVA/자바] SFTP 파일업로드/다운로드 (2) | 2017.04.06 |
[JAVA] 메인메소드 public static void main(String[] args) 를 이해하자 (18) | 2017.02.17 |
[JAVA] 이클립스 프로젝트 생성 및 실행 방법 (0) | 2015.02.24 |
[JAVA] 이클립스 설치방법 (0) | 2015.02.24 |