[导入]使用org.apache.tools.zip实现zip压缩和解压

import java.io.*;
import org.apache.tools.zip.*;
import java.util.Enumeration;
/**
*功能:zip压缩、解压(支持中文文件名)
*说明:本程序通过使用Apache Ant里提供的zip工具org.apache.tools.zip实现了zip压缩和解压功能.
*   解决了由于java.util.zip包不支持汉字的问题。
*   使用java.util.zip包时,当zip文件中有名字为中文的文件时,
*   就会出现异常:"Exception  in thread "main " java.lang.IllegalArgumentException  
*               at   java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
*注意:
*   1、使用时把ant.jar放到classpath中,程序中使用import org.apache.tools.zip.*;
*   2、Apache Ant 下载地址:[url]http://ant.apache.org/[/url]
*   3、Ant ZIP API:[url]http://www.jajakarta.org/ant/ant-1.6.1/docs/mix/manual/api/org/apache/tools/zip/[/url]
*   4、本程序使用Ant 1.7.1 中的ant.jar
*
*仅供编程学习参考.
*
*@author Winty
*@date   2008-8-3
*@Usage:
*   压缩:java AntZip -zip "directoryName"
*   解压:java AntZip -unzip "fileName.zip"
*/


public class AntZip{
     private ZipFile         zipFile;
     private ZipOutputStream zipOut;     //压缩Zip
     private ZipEntry        zipEntry;
     private static int       bufSize;     //size of bytes
     private byte []          buf;
     private int              readedBytes;
    
     public AntZip(){
         this (512);
    }

     public AntZip( int bufSize){
         this .bufSize = bufSize;
         this .buf = new byte [ this .bufSize];
    }
    
     //压缩文件夹内的文件
     public void doZip(String zipDirectory){ //zipDirectoryPath:需要压缩的文件夹名
        File file;
        File zipDir;

        zipDir = new File(zipDirectory);
        String zipFileName = zipDir.getName() + ".zip" ; //压缩后生成的zip文件名

         try {
             this .zipOut = new ZipOutputStream( new BufferedOutputStream( new FileOutputStream(zipFileName)));
            handleDir(zipDir , this .zipOut);
             this .zipOut.close();
        } catch (IOException ioe){
            ioe.printStackTrace();
        }
    }

     //由doZip调用,递归完成目录文件读取
     private void handleDir(File dir , ZipOutputStream zipOut) throws IOException{
        FileInputStream fileIn;
        File[] files;

        files = dir.listFiles();
    
         if (files.length == 0){ //如果目录为空,则单独创建之.
             //ZipEntry的isDirectory()方法中,目录以"/"结尾.
             this .zipOut.putNextEntry( new ZipEntry(dir.toString() + "/" ));
             this .zipOut.closeEntry();
        }
         else { //如果目录不为空,则分别处理目录和文件.
             for (File fileName : files){
                 //System.out.println(fileName);

                 if (fileName.isDirectory()){
                    handleDir(fileName , this .zipOut);
                }
                 else {
                    fileIn = new FileInputStream(fileName);
                     this .zipOut.putNextEntry( new ZipEntry(fileName.toString()));

                     while (( this .readedBytes = fileIn.read( this .buf))>0){
                         this .zipOut.write( this .buf , 0 , this .readedBytes);
                    }

                     this .zipOut.closeEntry();
                }
            }
        }
    }

     //解压指定zip文件
     public void unZip(String unZipfileName){ //unZipfileName需要解压的zip文件名
        FileOutputStream fileOut;
        File file;
        InputStream inputStream;

         try {
             this .zipFile = new ZipFile(unZipfileName);

             for (Enumeration entries = this .zipFile.getEntries(); entries.hasMoreElements();){
                ZipEntry entry = (ZipEntry)entries.nextElement();
                file = new File(entry.getName());

                 if (entry.isDirectory()){
                    file.mkdirs();
                }
                 else {
                     //如果指定文件的目录不存在,则创建之.
                    File parent = file.getParentFile();
                     if (!parent.exists()){
                        parent.mkdirs();
                    }

                    inputStream = zipFile.getInputStream(entry);

                    fileOut = new FileOutputStream(file);
                     while (( this .readedBytes = inputStream.read( this .buf) ) > 0){
                        fileOut.write( this .buf , 0 , this .readedBytes );
                    }
                    fileOut.close();

                    inputStream.close();
                }    
            }
             this .zipFile.close();
        } catch (IOException ioe){
            ioe.printStackTrace();
        }
    }

     //设置缓冲区大小
     public void setBufSize( int bufSize){
         this .bufSize = bufSize;
    }

     //测试AntZip类
     public static void main(String[] args) throws Exception{
         if (args.length==2){
            String name = args[1];
            AntZip zip = new AntZip();

             if (args[0].equals( "-zip" ))
                zip.doZip(name);
             else if (args[0].equals( "-unzip" ))
                zip.unZip(name);
        }
         else {
            System.out.println( "Usage:" );
            System.out.println( "压缩:java AntZip -zip directoryName" );
            System.out.println( "解压:java AntZip -unzip fileName.zip" );
             throw new Exception( "Arguments error!" );
        }
    }
}


文章来源:http://wintys.blog.51cto.com/425414/90878

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值