[출처] : http://bluejames77.blog.me/80015770905

자바에서 압축을 할려면 ZipInputStream과 GZIPInputStream을 써야 합니다.

 

이것을 이용해서 압축하는 예제를 JUNIT으로 만들어 보았습니다.

 

일단 예제를 보여드리기에 설명을 드리겠습니다.

 

1. ZipInputStream과 GZIPInputStream과의 차이점은 무엇인가요?

=> 쉽게 zip은 원도우에서 gzip은 유닉스나 리눅스에서 쓴다고 보시면 됩니다.

그러나 원도우에서도 gzip으로 압축해도 됩니다. gzip으로 하면 한글도 잘 압축됩니다.

zip은 한글 압축이 안되는데 이것은 따로 말씀드리도록 하겠습니다.

그리고 zip은 여러개를 한꺼번에 압축이 가능합니다. gzip은 지원이 안됩니다.

 

2. java.util.zip.ZipInputStream은 왜 한글 문서는 압축할 수가 없나요?

=> 이것은 썬의 버그라고 합니다. 썬것으로는 영문파일밖에는 안됩니다 -0-;

그래서 만약 한글 문서도 압축할려고 할려면 외국 개발자가 픽스해 놓은 클래스를 써야 합니다.

이것은 제가 첨부파일로 올려 놓겠습니다.

자세한 것은 이 URL을 참조하세요 마지막 덧글에 제 아이디도 보입니다 -_-a

http://www.javaservice.net/~java/bbs/read.cgi?m=resource&b=jdk&c=r_p&n=1100737475&k=압축&d=tb#1100737475

아래는 okjsp에서 pistos님이 답변해준 내용입니다.

java.util.zip은 압축파일내의 파일명 인코딩을 UTF-8로 처리해서 그래요.. 
zip 포맷이라는게 압축파일내의 파일명에 사용하는 인코딩을 지정하지 않았고, OS마다 encoding이 달라서 썬에서는 요걸 UTF-8로 정해놓고 쓰기로 한거라네요.. 
다음 버그리포트를 참고하시면 될거구요.. 

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4244499

 

3. flush()와 close()의 차이점과 쓰는 용도를 알고 싶습니다.

=> 스트림은 하나의 관이라고 보시면 됩니다 예를 들어 하수관 -_-;

즉 바이트의 흐름입니다. 중요한게 입력스트림은 입력만 가능하고 출력 스트림은 출력만 가능합니다.

생각해보세요 물을 받는 호스에서 갑자기 물이 역류한다면? 이 무슨 황당한 시츄에이션? 말이 안되죠? ^^;

flush()는 있는 물을 쏟아 버린다고 생각하시면 됩니다.

그래서 출력스트림에서 flush()를 해버리면.. 있는것을 다 털어 버리는거죠 예를 들면 호수를 탈탈 터는것!

그리고 close()는 수도 꼭지를 잠그는 것이라고 생각하면 됩니다. 우리가 보통 수도꼭지 잠글때 호스도 털죠?

호스 다 썼으니깐 털어야 하잖아요. ^^;

그래서 close()를 하면 호스를 털고[flush()] 수도꼭지를 잠근것[close()]한 것과 같은 의미입니다. 

close()하고 다시 쓸려면? open은 따로 없습니다. ^^; 다시 생성하셔야 합니다. 

 

4. ZipInputStream에만 있는 ZipEntry가 무슨 역할을 하는 것인가요?

=> ZipInputStream은 1번에서 말씀드렸다시피 여러개의 파일을 한꺼번에 압축할 수 있습니다.

원래 ZIP 파일이란 것이 하나 이상의 압축 파일을 포함하는데, 이때 각각의 파일은 ZIP 엔트리(Zip Entry)라고 합니다
Zip 엔트리는 ZipEntry 클래스의 객체로 표현되며, ZipEntry는 엔트리의 이름인 String 객체를 취하는 생성자를 가집니다.

이것도 예제(testFileZipComplex)를 보시면 금방 이해가 가실것입니다.

 

5. 이것도 디비처럼 꼭 close() 해줘야 하나요?

=> 넵 말이 필요없습니다!. 철저한 자원관리! ^-^;

예제를 보시면 제가 앞의 메소드들은 안하다가 뒤로 갈수록 했는데요.. 사실 이러시면 안됩니다!!

실전에서는 꼭 finally에서 닫아주는 센스!! 잊지마세요.

 

예제는 총 7개가 있습니다.
1. atestFileCopy 
 -> 파일카피 (스트림의 기본이라서 넣어 봤습니다 ^^;)
2. atestFileZipSimple
 -> 단순한 파일 압축. 한글깨지는 문제가 있음. 썬의 버그임 외국개발자가 버그 픽스한 라이브러리로 처리.
3. btestFileZipSimple2
 -> // 간단 압축된 파일 풀깅~ 
4. atestFileZipInOut2()
 -> ZipOutputStream을 이용한 압축 및 해제. 순서 1. 원본파일 -> 압축 -> 압축해제 후 원본파일 복귀
5. atestArrayFileZip()
 -> ZipOutputStream의 setLevel을 1-9까지 돌려보며 속도와 압축률 비교.
6. atestFileGZipInOut()
 -> GZIPOutputStream을 이용한 압축 및 해제. 순서 1.원본파일->압축->압축해제 후 원본파일복귀
7. testFileZipComplex
 -> 여러개의  파일을 하나의 zip파일로 압축.

 

소스 보시면 다 이해가 갈것입니다. 맛배기로 5번의 결과값을 보여드립니다. ^-^;

 

자바 디폴트 압축레벨8

Catalysis소개0.zip make Sucessed
Catalysis소개0.zip Size = 2086874 byte
 압축에 걸린 시간 측정 220 millisecond

Catalysis소개1.zip make Sucessed
Catalysis소개1.zip Size = 1548156 byte
 압축에 걸린 시간 측정 421 millisecond

Catalysis소개2.zip make Sucessed
Catalysis소개2.zip Size = 1541146 byte
 압축에 걸린 시간 측정 411 millisecond

Catalysis소개3.zip make Sucessed
Catalysis소개3.zip Size = 1534771 byte
 압축에 걸린 시간 측정 440 millisecond

Catalysis소개4.zip make Sucessed
Catalysis소개4.zip Size = 1526945 byte
 압축에 걸린 시간 측정 481 millisecond

Catalysis소개5.zip make Sucessed
Catalysis소개5.zip Size = 1520943 byte
 압축에 걸린 시간 측정 541 millisecond

Catalysis소개6.zip make Sucessed
Catalysis소개6.zip Size = 1516023 byte
 압축에 걸린 시간 측정 510 millisecond

Catalysis소개7.zip make Sucessed
Catalysis소개7.zip Size = 1515002 byte
 압축에 걸린 시간 측정 561 millisecond

Catalysis소개8.zip make Sucessed
Catalysis소개8.zip Size = 1513484 byte
 압축에 걸린 시간 측정 922 millisecond

Catalysis소개9.zip make Sucessed
Catalysis소개9.zip Size = 1512840 byte
 압축에 걸린 시간 측정 1081 millisecond

 

보시면 알겠지만 setLevel이 높을수록 압축률이 높고 속도가 떨어집니다. ^^;

디폴트는 8입니다.

 

ZipInputStream을 이해하는데 많은 도움이 되었으면 합니다. ^-^;

 

ps1 jazzlib_0.07은 외국개발자가 픽스해 놓은 소스.

      jazzlib.zip은 제가 위의 소스를 jar로 묶은것.

 

ps2 틀린점이나 추가할 사항이 있으시면 지적해 주는 센스!! 아시죠? ^^

+ Recent posts