[Java] java实现zip压缩和解压 (java.util.zip) →→→→→进入此内容的聊天室

来自 , 2019-11-06, 写在 Java, 查看 108 次.
URL http://www.code666.cn/view/07c5807d
  1. import java.io.*;
  2. import java.util.zip.*;
  3. /**
  4. *功能:zip压缩、解压
  5. *说明:本程序通过ZipOutputStream和ZipInputStream实现了zip压缩和解压功能.
  6. *问题:由于java.util.zip包并不支持汉字,当zip文件中有名字为中文的文件时,
  7. *     就会出现异常:"Exception  in thread "main " java.lang.IllegalArgumentException  
  8. *               at   java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
  9. *解决:
  10. *  方法1、修改import java.util.zip.ZipInputStream和ZipOutputStream.
  11. *          java.util.zip只支持UTF-8,Ant里面可以指定编码.
  12. *  方法2、使用Apache Ant里提供的zip工具。
  13. *          不使用java.util.zip的包,把ant.jar放到classpath中.
  14. *          程序中使用import org.apache.tools.zip.*;
  15. *
  16. *仅供编程学习参考.
  17. *
  18. *@author Winty
  19. *@date   2008-8-3
  20. *@Usage:
  21. *   压缩:java Zip -zip "directoryName"
  22. *   解压:java Zip -unzip "fileName.zip"
  23. */
  24.  
  25. public class Zip{
  26.     private ZipInputStream  zipIn;      //解压Zip
  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 Zip(){
  34.         this(512);
  35.     }
  36.  
  37.     public Zip(int bufSize){
  38.         this.bufSize = bufSize;
  39.         this.buf = new byte[this.bufSize];
  40.     }
  41.      
  42.     //压缩文件夹内的文件
  43.     public void doZip(String zipDirectory){//zipDirectoryPath:需要压缩的文件夹名
  44.         File file;
  45.         File zipDir;
  46.  
  47.         zipDir = new File(zipDirectory);
  48.         String zipFileName = zipDir.getName() + ".zip";//压缩后生成的zip文件名
  49.  
  50.         try{
  51.             this.zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName)));
  52.             handleDir(zipDir , this.zipOut);
  53.             this.zipOut.close();
  54.         }catch(IOException ioe){
  55.             ioe.printStackTrace();
  56.         }
  57.     }
  58.  
  59.     //由doZip调用,递归完成目录文件读取
  60.     private void handleDir(File dir , ZipOutputStream zipOut)throws IOException{
  61.         FileInputStream fileIn;
  62.         File[] files;
  63.  
  64.         files = dir.listFiles();
  65.      
  66.         if(files.length == 0){//如果目录为空,则单独创建之.
  67.             //ZipEntry的isDirectory()方法中,目录以"/"结尾.
  68.             this.zipOut.putNextEntry(new ZipEntry(dir.toString() + "/"));
  69.             this.zipOut.closeEntry();
  70.         }
  71.         else{//如果目录不为空,则分别处理目录和文件.
  72.             for(File fileName : files){
  73.                 //System.out.println(fileName);
  74.  
  75.                 if(fileName.isDirectory()){
  76.                     handleDir(fileName , this.zipOut);
  77.                 }
  78.                 else{
  79.                     fileIn = new FileInputStream(fileName);
  80.                     this.zipOut.putNextEntry(new ZipEntry(fileName.toString()));
  81.  
  82.                     while((this.readedBytes = fileIn.read(this.buf))>0){
  83.                         this.zipOut.write(this.buf , 0 , this.readedBytes);
  84.                     }
  85.  
  86.                     this.zipOut.closeEntry();
  87.                 }
  88.             }
  89.         }
  90.     }
  91.  
  92.     //解压指定zip文件
  93.     public void unZip(String unZipfileName){//unZipfileName需要解压的zip文件名
  94.         FileOutputStream fileOut;
  95.         File file;
  96.  
  97.         try{
  98.             this.zipIn = new ZipInputStream (new BufferedInputStream(new FileInputStream(unZipfileName)));
  99.  
  100.             while((this.zipEntry = this.zipIn.getNextEntry()) != null){
  101.                 file = new File(this.zipEntry.getName());
  102.                 //System.out.println(file);///
  103.  
  104.                 if(this.zipEntry.isDirectory()){
  105.                     file.mkdirs();
  106.                 }
  107.                 else{
  108.                     //如果指定文件的目录不存在,则创建之.
  109.                     File parent = file.getParentFile();
  110.                     if(!parent.exists()){
  111.                         parent.mkdirs();
  112.                     }
  113.  
  114.                     fileOut = new FileOutputStream(file);
  115.                     while(( this.readedBytes = this.zipIn.read(this.buf) ) > 0){
  116.                         fileOut.write(this.buf , 0 , this.readedBytes );
  117.                     }
  118.                     fileOut.close();
  119.                 }
  120.                 this.zipIn.closeEntry();    
  121.             }
  122.         }catch(IOException ioe){
  123.             ioe.printStackTrace();
  124.         }
  125.     }
  126.  
  127.     //设置缓冲区大小
  128.     public void setBufSize(int bufSize){
  129.         this.bufSize = bufSize;
  130.     }
  131.  
  132.     //测试Zip类
  133.     public static void main(String[] args)throws Exception{
  134.         if(args.length==2){
  135.             String name = args[1];
  136.             Zip zip = new Zip();
  137.  
  138.             if(args[0].equals("-zip"))
  139.                 zip.doZip(name);
  140.             else if(args[0].equals("-unzip"))
  141.                 zip.unZip(name);
  142.         }
  143.         else{
  144.             System.out.println("Usage:");
  145.             System.out.println("压缩:java Zip -zip directoryName");
  146.             System.out.println("解压:java Zip -unzip fileName.zip");
  147.             throw new Exception("Arguments error!");
  148.         }
  149.     }
  150. }

回复 "java实现zip压缩和解压 (java.util.zip)"

这儿你可以回复上面这条便签

captcha