详解java解压缩zip和rar的工具类使用教程

jerry Java 2016年03月12日 收藏
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格式的压缩包!");     
        }     
    }     
}