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 下载地址:[url]http://ant.apache.org/[/url]
  14. *  3、Ant ZIP API:[url]http://www.jajakarta.org/ant/ant[/url] ... 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. public class AntZip{
  26.     private ZipFile        zipFile;
  27.     private ZipOutputStream zipOut;    //压缩Zip
  28.     private ZipEntry        zipEntry;
  29.     private static int      bufSize;    //size of bytes
  30.     private byte[]          buf;
  31.     private int            readedBytes;
  32.    
  33.     public AntZip(){
  34.         this(512);
  35.     }

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

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

  47.         try{
  48.             this.zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName)));
  49.             handleDir(zipDir , this.zipOut);
  50.             this.zipOut.close();
  51.         }catch(IOException ioe){
  52.             ioe.printStackTrace();
  53.         }
  54.     }

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

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

  69.                 if(fileName.isDirectory()){
  70.                     handleDir(fileName , this.zipOut);
  71.                 }
  72.                 else{
  73.                     fileIn = new FileInputStream(fileName);
  74.                     this.zipOut.putNextEntry(new ZipEntry(fileName.toString()));

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

  78.                     this.zipOut.closeEntry();
  79.                 }
  80.             }
  81.         }
  82.     }

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

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

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

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

  102.                     inputStream = zipFile.getInputStream(entry);

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

  108.                     inputStream.close();
  109.                 }   
  110.             }
  111.             this.zipFile.close();
  112.         }catch(IOException ioe){
  113.             ioe.printStackTrace();
  114.         }
  115.     }

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

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

  125.             if(args[0].equals("-zip"))
  126.                 zip.doZip(name);
  127.             else if(args[0].equals("-unzip"))
  128.                 zip.unZip(name);
  129.         }
  130.         else{
  131.             System.out.println("Usage:");
  132.             System.out.println("压缩:java AntZip -zip directoryName");
  133.             System.out.println("解压:java AntZip -unzip fileName.zip");
  134.             throw new Exception("Arguments error!");
  135.         }
  136.     }
  137. }
复制代码

ant1.7.1.jar下载:
附件: 亲,您没有权限下载或查看附件喔:-) 试试登录注册吧!
TOP

谢谢楼主分享
TOP

111

^_^热噩噩噩
TOP

下载来的
TOP

adfdsafasdf
dfasdf
sdf
sdf
TOP

深情顶帖,楼主加油!
TOP

深情顶帖,楼主加油!
TOP

深情顶帖,楼主加油!
TOP

sss

sssss
TOP

回复 1# cobra 的帖子

及时雨啊。
TOP