apache.commons.compress 받는곳
https://commons.apache.org/proper/commons-compress/download_compress.cgi
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 java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
public class ZipTest {public static void main(String[] args) throws Throwable {
String path = "C:\\Users\\yuri\\Downloads\\commons-compress-1.16.1-bin\\commons-compress-1.16.1";
//compress(path);
decompress(path + "\\테스트.zip", path + "\\test");
}/**
* <pre>파일 압축하기</pre>
* 파라메타 path가 폴더 이면 폴더 전체를 압축하고 파일경우는 파일만 압축
* @param path
* @throws IOException
*/
public static void compress(String path) throws IOException {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();
}}
}/**
* <pre>파일압축 해제</pre>
*
* @param zipFileName 압축파일명
* @param directory 압축이 풀릴 파일 경로
* @throws Throwable
*/
public static void decompress(String zipFileName, String directory) throws Throwable {File zipFile = new File(zipFileName);
FileInputStream fis = null;
ZipInputStream zis = null;
ZipEntry zipentry = null;try {
//파일 스트림
fis = new FileInputStream(zipFile);//Zip 파일 스트림
zis = new ZipInputStream(fis);//entry가 없을때까지 뽑기
while ((zipentry = zis.getNextEntry()) != null) {String filename = zipentry.getName();
File file = new File(directory, filename);
//entiry가 폴더면 폴더 생성
if (zipentry.isDirectory()) {
file.mkdirs();
} else {
//파일이면 파일 만들기
createFile(file, zis);
}}
} catch (Throwable e) {
throw e;
} finally {if (zis != null)
zis.close();if (fis != null)
fis.close();}
}
/**
* <pre>파일 경로에 압축 푼 파일 생성</pre>
*
* @param file
* @param zis
* @throws Throwable
*/
private static void createFile(File file, ZipInputStream zis) throws Throwable {//디렉토리 확인
File parentDir = new File(file.getParent());//디렉토리가 없으면 생성하자
if (!parentDir.exists()) {
parentDir.mkdirs();
}//파일 스트림 선언
try (FileOutputStream 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;
}}
}
참조 :
압축하기 : 출처: http://javacpro.tistory.com/21 [버물리의 IT공부]
압축 풀기 : http://nowonbun.tistory.com/321 [명월 일지]
'JAVA > Common' 카테고리의 다른 글
ArrayList 정렬 및 자르기 (0) | 2016.03.07 |
---|---|
형 변환 모음... (0) | 2015.05.28 |
인코딩 한방에 테스트 하기 (0) | 2015.04.23 |
String.format()을 이용하여 Date 표현하기 (0) | 2013.10.01 |