使用Java实现文件的压缩和解压缩

24 篇文章 0 订阅
  • 功能:zip压缩、解压
  • 说明:本程序通过ZipOutputStream和ZipInputStream实现了zip压缩和解压功能.
  • 问题:由于java.util.zip包并不支持汉字,当zip文件中有名字为中文的文件时就会出现异常:"Exception in thread "main " java.lang.IllegalArgumentException at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:285)
  • 解决: 
    • 方法1、修改import java.util.zip.ZipInputStream和ZipOutputStream.java.util.zip只支持UTF-8,Ant里面可以指定编码.
    • 方法2、使用Apache Ant里提供的zip工具。不使用java.util.zip的包,把ant.jar放到classpath中. 
      程序中使用import org.apache.tools.zip.*;

仅供编程学习参考.代码如下:

 

[java]  view plain copy
  1. import java.io.*;   
  2. import java.util.zip.*;   
  3. /** 
  4. *@author Winty  
  5. *@Usage:  
  6. *   压缩:java Zip -zip "directoryName"  
  7. *   解压:java Zip -unzip "fileName.zip"  
  8. */   
  9. public class Zip{   
  10.     private ZipInputStream  zipIn;      //解压Zip   
  11.     private ZipOutputStream zipOut;     //压缩Zip   
  12.     private ZipEntry        zipEntry;   
  13.     private static int      bufSize;    //size of bytes   
  14.     private byte[]          buf;   
  15.     private int             readedBytes;   
  16.        
  17.     public Zip(){   
  18.         this(512);   
  19.     }   
  20.     public Zip(int bufSize){   
  21.         this.bufSize = bufSize;   
  22.         this.buf = new byte[this.bufSize];   
  23.     }   
  24.        
  25.     //压缩文件夹内的文件   
  26.     public void doZip(String zipDirectory){//zipDirectoryPath:需要压缩的文件夹名   
  27.         File file;   
  28.         File zipDir;   
  29.         zipDir = new File(zipDirectory);   
  30.         String zipFileName = zipDir.getName() + ".zip";//压缩后生成的zip文件名   
  31.         try{   
  32.             this.zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName)));   
  33.             handleDir(zipDir , this.zipOut);   
  34.             this.zipOut.close();   
  35.         }catch(IOException ioe){   
  36.             ioe.printStackTrace();   
  37.         }   
  38.     }   
  39.     //由doZip调用,递归完成目录文件读取   
  40.     private void handleDir(File dir , ZipOutputStream zipOut)throws IOException{   
  41.         FileInputStream fileIn;   
  42.         File[] files;   
  43.         files = dir.listFiles();   
  44.        
  45.         if(files.length == 0){//如果目录为空,则单独创建之.   
  46.             //ZipEntry的isDirectory()方法中,目录以"/"结尾.   
  47.             this.zipOut.putNextEntry(new ZipEntry(dir.toString() + "/"));   
  48.             this.zipOut.closeEntry();   
  49.         }   
  50.         else{//如果目录不为空,则分别处理目录和文件.   
  51.             for(File fileName : files){   
  52.                 //System.out.println(fileName);   
  53.                 if(fileName.isDirectory()){   
  54.                     handleDir(fileName , this.zipOut);   
  55.                 }   
  56.                 else{   
  57.                     fileIn = new FileInputStream(fileName);   
  58.                     this.zipOut.putNextEntry(new ZipEntry(fileName.toString()));   
  59.                     while((this.readedBytes = fileIn.read(this.buf))>0){   
  60.                         this.zipOut.write(this.buf , 0 , this.readedBytes);   
  61.                     }   
  62.                     this.zipOut.closeEntry();   
  63.                 }   
  64.             }   
  65.         }   
  66.     }   
  67.     //解压指定zip文件   
  68.     public void unZip(String unZipfileName){//unZipfileName需要解压的zip文件名   
  69.         FileOutputStream fileOut;   
  70.         File file;   
  71.         try{   
  72.             this.zipIn = new ZipInputStream (new BufferedInputStream(new FileInputStream(unZipfileName)));   
  73.             while((this.zipEntry = this.zipIn.getNextEntry()) != null){   
  74.                 file = new File(this.zipEntry.getName());   
  75.                 //System.out.println(file);///   
  76.                 if(this.zipEntry.isDirectory()){   
  77.                     file.mkdirs();   
  78.                 }   
  79.                 else{   
  80.                     //如果指定文件的目录不存在,则创建之.   
  81.                     File parent = file.getParentFile();   
  82.                     if(!parent.exists()){   
  83.                         parent.mkdirs();   
  84.                     }   
  85.                     fileOut = new FileOutputStream(file);   
  86.                     while(( this.readedBytes = this.zipIn.read(this.buf) ) > 0){   
  87.                         fileOut.write(this.buf , 0 , this.readedBytes );   
  88.                     }   
  89.                     fileOut.close();   
  90.                 }   
  91.                 this.zipIn.closeEntry();       
  92.             }   
  93.         }catch(IOException ioe){   
  94.             ioe.printStackTrace();   
  95.         }   
  96.     }   
  97.     //设置缓冲区大小   
  98.     public void setBufSize(int bufSize){   
  99.         this.bufSize = bufSize;   
  100.     }   
  101.     //测试Zip类   
  102.     public static void main(String[] args)throws Exception{   
  103.         if(args.length==2){   
  104.             String name = args[1];   
  105.             Zip zip = new Zip();   
  106.             if(args[0].equals("-zip"))   
  107.                 zip.doZip(name);   
  108.             else if(args[0].equals("-unzip"))   
  109.                 zip.unZip(name);   
  110.         }   
  111.         else{   
  112.             System.out.println("Usage:");   
  113.             System.out.println("压缩:java Zip -zip http://www.bt285.cn /directoryName");   
  114.             System.out.println("解压:java Zip -unzip http://www.feng123.com /fileName.zip");   
  115.             throw new Exception("Arguments error!");   
  116.         }   
  117.     }   
  118. }  

 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值