프로젝트중 갑자기 여러파일을 압축해서 내려받게 해달라는 요청이 들어와
여기저기 사이트를 돌아다니며 얻은 정보를 정리하여 올린다.
파일 압축은 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 |