设为首页 收藏本站
查看: 515|回复: 0

[经验分享] 使用org.apache.tools.zip实现zip压缩和解压

[复制链接]

尚未签到

发表于 2015-8-3 12:19:02 | 显示全部楼层 |阅读模式
1 import java.io.*;
  2 import org.apache.tools.zip.*;
  3 import java.util.Enumeration;
  4 /**
  5 *功能:zip压缩、解压(支持中文文件名)
  6 *说明:本程序通过使用Apache Ant里提供的zip工具org.apache.tools.zip实现了zip压缩和解压功能.
  7 *   解决了由于java.util.zip包不支持汉字的问题。
  8 *   使用java.util.zip包时,当zip文件中有名字为中文的文件时,
  9 *   就会出现异常:"Exception  in thread "main " java.lang.IllegalArgumentException  
10 *               at   java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
11 *注意:
12 *   1、使用时把ant.jar放到classpath中,程序中使用import org.apache.tools.zip.*;
13 *   2、Apache Ant 下载地址:http://ant.apache.org/
14 *   3、Ant ZIP API:http://www.jajakarta.org/ant/ant ... g/apache/tools/zip/
15 *   4、本程序使用Ant 1.7.1 中的ant.jar
16 *
17 *仅供编程学习参考.
18 *
19 *@author Winty
20 *@date   2008-8-3
21 *@Usage:
22 *   压缩:java AntZip -zip "directoryName"
23 *   解压:java AntZip -unzip "fileName.zip"
24 */
25
26 public class AntZip{
27     private ZipFile         zipFile;
28     private ZipOutputStream zipOut;     //压缩Zip
29     private ZipEntry        zipEntry;
30     private static int      bufSize;    //size of bytes
31     private byte[]          buf;
32     private int             readedBytes;
33     
34     public AntZip(){
35         this(512);
36     }
37
38     public AntZip(int bufSize){
39         this.bufSize = bufSize;
40         this.buf = new byte[this.bufSize];
41     }
42     
43     //压缩文件夹内的文件
44     public void doZip(String zipDirectory){//zipDirectoryPath:需要压缩的文件夹名
45         File file;
46         File zipDir;
47
48         zipDir = new File(zipDirectory);
49         String zipFileName = zipDir.getName() + ".zip";//压缩后生成的zip文件名
50
51         try{
52             this.zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName)));
53             handleDir(zipDir , this.zipOut);
54             this.zipOut.close();
55         }catch(IOException ioe){
56             ioe.printStackTrace();
57         }
58     }
59
60     //由doZip调用,递归完成目录文件读取
61     private void handleDir(File dir , ZipOutputStream zipOut)throws IOException{
62         FileInputStream fileIn;
63         File[] files;
64
65         files = dir.listFiles();
66     
67         if(files.length == 0){//如果目录为空,则单独创建之.
68             //ZipEntry的isDirectory()方法中,目录以"/"结尾.
69             this.zipOut.putNextEntry(new ZipEntry(dir.toString() + "/"));
70             this.zipOut.closeEntry();
71         }
72         else{//如果目录不为空,则分别处理目录和文件.
73             for(File fileName : files){
74                 //System.out.println(fileName);
75
76                 if(fileName.isDirectory()){
77                     handleDir(fileName , this.zipOut);
78                 }
79                 else{
80                     fileIn = new FileInputStream(fileName);
81                     this.zipOut.putNextEntry(new ZipEntry(fileName.toString()));
82
83                     while((this.readedBytes = fileIn.read(this.buf))>0){
84                         this.zipOut.write(this.buf , 0 , this.readedBytes);
85                     }
86
87                     this.zipOut.closeEntry();
88                 }
89             }
90         }
91     }
92
93     //解压指定zip文件
94     public void unZip(String unZipfileName){//unZipfileName需要解压的zip文件名
95         FileOutputStream fileOut;
96         File file;
97         InputStream inputStream;
98
99         try{
100             this.zipFile = new ZipFile(unZipfileName);
101
102             for(Enumeration entries = this.zipFile.getEntries(); entries.hasMoreElements();){
103                 ZipEntry entry = (ZipEntry)entries.nextElement();
104                 file = new File(entry.getName());
105
106                 if(entry.isDirectory()){
107                     file.mkdirs();
108                 }
109                 else{
110                     //如果指定文件的目录不存在,则创建之.
111                     File parent = file.getParentFile();
112                     if(!parent.exists()){
113                         parent.mkdirs();
114                     }
115
116                     inputStream = zipFile.getInputStream(entry);
117
118                     fileOut = new FileOutputStream(file);
119                     while(( this.readedBytes = inputStream.read(this.buf) ) > 0){
120                         fileOut.write(this.buf , 0 , this.readedBytes );
121                     }
122                     fileOut.close();
123
124                     inputStream.close();
125                 }   
126             }
127             this.zipFile.close();
128         }catch(IOException ioe){
129             ioe.printStackTrace();
130         }
131     }
132
133     //设置缓冲区大小
134     public void setBufSize(int bufSize){
135         this.bufSize = bufSize;
136     }
137
138     //测试AntZip类
139     public static void main(String[] args)throws Exception{
140         if(args.length==2){
141             String name = args[1];
142             AntZip zip = new AntZip();
143
144             if(args[0].equals("-zip"))
145                 zip.doZip(name);
146             else if(args[0].equals("-unzip"))
147                 zip.unZip(name);
148         }
149         else{
150             System.out.println("Usage:");
151             System.out.println("压缩:java AntZip -zip directoryName");
152             System.out.println("解压:java AntZip -unzip fileName.zip");
153             throw new Exception("Arguments error!");
154         }
155     }
156 }
  版权所有,转载请务必保留此出处http://wintys.blog.iyunv.com/425414/90878

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-93687-1-1.html 上篇帖子: (转) Apache rewrite技术实现Apache到lighttpd迁移 下篇帖子: Apache
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表