package decompress;    

     

import java.io.File;    

import java.io.FileOutputStream;    

     

import org.apache.tools.ant.Project;    

import org.apache.tools.ant.taskdefs.Expand;    

     

import de.innosystec.unrar.Archive;    

import de.innosystec.unrar.rarfile.FileHeader;    

     

public class DeCompressUtil {    

   /**  

    * 解压zip格式压缩包  

    * 对应的是ant.jar  

    */   

   private static void unzip(String sourceZip,String destDir) throws Exception{    

       try{    

           Project p = new Project();    

           Expand e = new Expand();    

           e.setProject(p);    

           e.setSrc(new File(sourceZip));    

           e.setOverwrite(false);    

           e.setDest(new File(destDir));    

           /*  

           ant下的zip工具默认压缩编码为UTF-8编码,  

           而winRAR软件压缩是用的windows默认的GBK或者GB2312编码  

           所以解压缩时要制定编码格式  

           */   

           e.setEncoding("gbk");    

           e.execute();    

       }catch(Exception e){    

           throw e;    

       }    

   }    

   /**  

    * 解压rar格式压缩包。  

    * 对应的是java-unrar-0.3.jar,但是java-unrar-0.3.jar又会用到commons-logging-1.1.1.jar  

    */   

   private static void unrar(String sourceRar,String destDir) throws Exception{    

       Archive a = null;    

       FileOutputStream fos = null;    

       try{    

           a = new Archive(new File(sourceRar));    

           FileHeader fh = a.nextFileHeader();    

           while(fh!=null){    

               if(!fh.isDirectory()){    

                   //1 根据不同的操作系统拿到相应的 destDirName 和 destFileName    

                   String compressFileName = fh.getFileNameString().trim();    

                   String destFileName = "";    

                   String destDirName = "";    

                   //非windows系统    

                   if(File.separator.equals("/")){    

                       destFileName = destDir + compressFileName.replaceAll("\\\\", "/");    

                       destDirName = destFileName.substring(0, destFileName.lastIndexOf("/"));    

                   //windows系统     

                   }else{    

                       destFileName = destDir + compressFileName.replaceAll("/", "\\\\");    

                       destDirName = destFileName.substring(0, destFileName.lastIndexOf("\\"));    

                   }    

                   //2创建文件夹    

                   File dir = new File(destDirName);    

                   if(!dir.exists()||!dir.isDirectory()){    

                       dir.mkdirs();    

                   }    

                   //3解压缩文件    

                   fos = new FileOutputStream(new File(destFileName));    

                   a.extractFile(fh, fos);    

                   fos.close();    

                   fos = null;    

               }    

               fh = a.nextFileHeader();    

           }    

           a.close();    

           a = null;    

       }catch(Exception e){    

           throw e;    

       }finally{    

           if(fos!=null){    

               try{fos.close();fos=null;}catch(Exception e){e.printStackTrace();}    

           }    

           if(a!=null){    

               try{a.close();a=null;}catch(Exception e){e.printStackTrace();}    

           }    

       }    

   }    

   /**  

    * 解压缩  

    */   

   public static void deCompress(String sourceFile,String destDir) throws Exception{    

       //保证文件夹路径最后是"/"或者"\"    

       char lastChar = destDir.charAt(destDir.length()-1);    

       if(lastChar!='/'&&lastChar!='\\'){    

           destDir += File.separator;    

       }    

       //根据类型,进行相应的解压缩    

       String type = sourceFile.substring(sourceFile.lastIndexOf(".")+1);    

       if(type.equals("zip")){    

           DeCompressUtil.unzip(sourceFile, destDir);    

        }else if(type.equals("rar")){    

            DeCompressUtil.unrar(sourceFile, destDir);    

        }else{    

            throw new Exception("只支持zip和rar格式的压缩包!");    

        }    

    }    

}