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

jerry Java 2016年03月12日 收藏
  1. package decompress;     
  2.     
  3. import java.io.File;     
  4. import java.io.FileOutputStream;     
  5.     
  6. import org.apache.tools.ant.Project;     
  7. import org.apache.tools.ant.taskdefs.Expand;     
  8.     
  9. import de.innosystec.unrar.Archive;     
  10. import de.innosystec.unrar.rarfile.FileHeader;     
  11.     
  12. public class DeCompressUtil {     
  13.    /**   
  14.     * 解压zip格式压缩包   
  15.     * 对应的是ant.jar   
  16.     */    
  17.    private static void unzip(String sourceZip,String destDir) throws Exception{     
  18.        try{     
  19.            Project p = new Project();     
  20.            Expand e = new Expand();     
  21.            e.setProject(p);     
  22.            e.setSrc(new File(sourceZip));     
  23.            e.setOverwrite(false);     
  24.            e.setDest(new File(destDir));     
  25.            /*   
  26.            ant下的zip工具默认压缩编码为UTF-8编码,   
  27.            而winRAR软件压缩是用的windows默认的GBK或者GB2312编码   
  28.            所以解压缩时要制定编码格式   
  29.            */    
  30.            e.setEncoding("gbk");     
  31.            e.execute();     
  32.        }catch(Exception e){     
  33.            throw e;     
  34.        }     
  35.    }     
  36.    /**   
  37.     * 解压rar格式压缩包。   
  38.     * 对应的是java-unrar-0.3.jar,但是java-unrar-0.3.jar又会用到commons-logging-1.1.1.jar   
  39.     */    
  40.    private static void unrar(String sourceRar,String destDir) throws Exception{     
  41.        Archive a = null;     
  42.        FileOutputStream fos = null;     
  43.        try{     
  44.            a = new Archive(new File(sourceRar));     
  45.            FileHeader fh = a.nextFileHeader();     
  46.            while(fh!=null){     
  47.                if(!fh.isDirectory()){     
  48.                    //1 根据不同的操作系统拿到相应的 destDirName 和 destFileName     
  49.                    String compressFileName = fh.getFileNameString().trim();     
  50.                    String destFileName = "";     
  51.                    String destDirName = "";     
  52.                    //非windows系统     
  53.                    if(File.separator.equals("/")){     
  54.                        destFileName = destDir + compressFileName.replaceAll("\\\\", "/");     
  55.                        destDirName = destFileName.substring(0, destFileName.lastIndexOf("/"));     
  56.                    //windows系统      
  57.                    }else{     
  58.                        destFileName = destDir + compressFileName.replaceAll("/", "\\\\");     
  59.                        destDirName = destFileName.substring(0, destFileName.lastIndexOf("\\"));     
  60.                    }     
  61.                    //2创建文件夹     
  62.                    File dir = new File(destDirName);     
  63.                    if(!dir.exists()||!dir.isDirectory()){     
  64.                        dir.mkdirs();     
  65.                    }     
  66.                    //3解压缩文件     
  67.                    fos = new FileOutputStream(new File(destFileName));     
  68.                    a.extractFile(fh, fos);     
  69.                    fos.close();     
  70.                    fos = null;     
  71.                }     
  72.                fh = a.nextFileHeader();     
  73.            }     
  74.            a.close();     
  75.            a = null;     
  76.        }catch(Exception e){     
  77.            throw e;     
  78.        }finally{     
  79.            if(fos!=null){     
  80.                try{fos.close();fos=null;}catch(Exception e){e.printStackTrace();}     
  81.            }     
  82.            if(a!=null){     
  83.                try{a.close();a=null;}catch(Exception e){e.printStackTrace();}     
  84.            }     
  85.        }     
  86.    }     
  87.    /**   
  88.     * 解压缩   
  89.     */    
  90.    public static void deCompress(String sourceFile,String destDir) throws Exception{     
  91.        //保证文件夹路径最后是"/"或者"\"     
  92.        char lastChar = destDir.charAt(destDir.length()-1);     
  93.        if(lastChar!='/'&&lastChar!='\\'){     
  94.            destDir += File.separator;     
  95.        }     
  96.        //根据类型,进行相应的解压缩     
  97.        String type = sourceFile.substring(sourceFile.lastIndexOf(".")+1);     
  98.        if(type.equals("zip")){     
  99.            DeCompressUtil.unzip(sourceFile, destDir);     
  100.         }else if(type.equals("rar")){     
  101.             DeCompressUtil.unrar(sourceFile, destDir);     
  102.         }else{     
  103.             throw new Exception("只支持zip和rar格式的压缩包!");     
  104.         }     
  105.     }     
  106. }