论坛首页 Java企业应用论坛

用java解压缩zip和rar的工具类

浏览 6091 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-06-08   最后修改:2011-06-09
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格式的压缩包!");
		}
	}
}
  • ant.jar (1.4 MB)
  • 下载次数: 464
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics