一个解压缩和压缩zip文件的工具类

package com.keyware.kt.utiles;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.List;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.exception.RarException.RarExceptionType;
import com.github.junrar.rarfile.FileHeader;
public class ZipUtil {
	 private static final int buffer = 2048; 
	 /** 
	  * 解压Zip文件 
	  * @param path 文件目录 
	  */
	 public static Boolean unZip(String path) throws Exception{ 
		boolean flag = false;
	    int count = -1; 
	    String savepath = ""; 
	    File file = null; 
	    InputStream is = null; 
	    FileOutputStream fos = null; 
	    BufferedOutputStream bos = null; 
	    savepath = path.substring(0, path.lastIndexOf(".")) + File.separator; //保存解压文件目录 
	    new File(savepath).mkdir(); //创建保存目录 
	    ZipFile zipFile = null; 
	    try
	    { 
	      zipFile = new ZipFile(path,"gbk"); //解决中文乱码问题 
	      Enumeration<?> entries = zipFile.getEntries(); 
	      while(entries.hasMoreElements()) 
	      { 
	        byte buf[] = new byte[buffer]; 
	        ZipEntry entry = (ZipEntry)entries.nextElement(); 
	        String filename = entry.getName(); 
	        boolean ismkdir = false; 
	        if(filename.lastIndexOf("/") != -1){ //检查此文件是否带有文件夹 
	         ismkdir = true; 
	        } 
	        filename = savepath + filename; 
	        if(entry.isDirectory()){ //如果是文件夹先创建 
	         file = new File(filename); 
	         file.mkdirs(); 
	          continue; 
	        } 
	        file = new File(filename); 
	        if(!file.exists()){ //如果是目录先创建 
	         if(ismkdir){ 
	         new File(filename.substring(0, filename.lastIndexOf("/"))).mkdirs(); //目录先创建 
	         } 
	        } 
	        file.createNewFile(); //创建文件 
	        is = zipFile.getInputStream(entry); 
	        fos = new FileOutputStream(file); 
	        bos = new BufferedOutputStream(fos, buffer); 
	        while((count = is.read(buf)) > -1) 
	        { 
	          bos.write(buf, 0, count); 
	        } 
	        bos.flush(); 
	        bos.close(); 
	        fos.close(); 
	        is.close(); 
	      } 
	      zipFile.close(); 
	      flag = true;
	    }catch(IOException ioe){ 
	      ioe.printStackTrace(); 
	      throw ioe;
	    }finally{ 
	       try{ 
	       if(bos != null){ 
	         bos.close(); 
	       } 
	       if(fos != null) { 
	         fos.close(); 
	       } 
	       if(is != null){ 
	         is.close(); 
	       } 
	       if(zipFile != null){ 
	         zipFile.close(); 
	       } 
	       }catch(Exception e) { 
	         e.printStackTrace(); 
	       } 
	     }
	    return flag;
	   }
	 
		/**
		 * @param rarFileName rar file name
		 * @param outFilePath output file path  
		 * @return success Or Failed
		 * @author zhuss
		 * @throws Exception
		 */
		public static boolean  unrar(String rarFileName)  throws  Exception{  
			boolean flag = false;
	        try  {  
	            Archive archive = new  Archive(new File(rarFileName));  
	            if(archive == null){
	            	throw new FileNotFoundException(rarFileName + " NOT FOUND!");
	            }
	            if(archive.isEncrypted()){
	            	throw new Exception(rarFileName + " IS ENCRYPTED!");
	            }
	            List<FileHeader> files =  archive.getFileHeaders();
	            
	            String savepath = rarFileName.substring(0, rarFileName.lastIndexOf(".")) + File.separator;
	            
	            for (FileHeader fh : files) {
	            		if(fh.isEncrypted()){
	            			throw new Exception(rarFileName + " IS ENCRYPTED!");
	            		} 
	            		String fileName1 = fh.getFileNameString();
	            		String fileName = URLDecoder.decode(fileName1, "UTF-8");
	            		if(fileName != null && fileName.trim().length() > 0){
	            			String saveFileName = savepath+"\\"+fileName;
		            		File saveFile = new File(saveFileName);
		            		if(saveFile.isDirectory()){
		            			continue;
		            		}
		            		File parent =  saveFile.getParentFile();
		            		if(!parent.exists()){
		            			parent.mkdirs();
		            		}
		            		if(!saveFile.exists()){
		            			saveFile.createNewFile();
		            		}
		            		FileOutputStream fos = new FileOutputStream(saveFile);
		            		try { 
		            			archive.extractFile(fh, fos); 
		            			fos.flush();
		            			fos.close();
		            			//archive.close();
		            		} catch (RarException e) { 
			            		if(e.getType().equals(RarExceptionType.notImplementedYet)){ 
			            		} 
		            		}finally{ 
		            			fos.flush();
		            			fos.close();
		            			//archive.close();
	 						} 
	            		}
				}
	            archive.close();
	            flag = true;
	        } catch  (Exception e) {
	        	e.printStackTrace();
	        	throw e;
	        }
	        return flag;
	    } 
			/**  
		    * 解压缩  
		    */   
		   public static Boolean deCompress(String sourceFile) throws Exception{    
		       //根据类型,进行相应的解压缩    
		       String type = sourceFile.substring(sourceFile.lastIndexOf(".")+1);    
		       if(type.equals("zip")){    
		    	   return unZip(sourceFile);    
		        }else if(type.equals("rar")){    
		        	return  unrar(sourceFile);    
		        }else{    
		            throw new Exception("只支持zip和rar格式的压缩包!"); 
		        }    
		    }
		
		
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值