`

解压zip包或者rar包工具类

    博客分类:
  • java
 
阅读更多
package com.ylink.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Expand;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

import de.innosystec.unrar.Archive;
import de.innosystec.unrar.rarfile.FileHeader;

/**
 * 解压zip包或者rar包工具类
 *
 */
public class DeCompressUtil {
	private static final int BUFFEREDSIZE = 1024;

	 /**
	  * 解压zip的内容到指定的目录下,可以处理其文件夹下包含子文件夹的情况
	  * @param zipFilename
	  *            要解压的zip包文件
	  * @param destDir
	  *            解压后存放的目录
	 * @throws Exception 
	  */
	 public synchronized static void unzip(String zipFilename, String destDir) throws Exception {
		 try  {
			 File outFile = new File(destDir);
			 if (!outFile.exists()) {
				 outFile.mkdirs();
			 }
			 File zipF = new File(zipFilename);
			 if ((!zipF.exists()) && (zipF.length() <=  0 )) {   
				 throw new Exception( "要解压的文件不存在!" );   
			 } 
			 ZipFile zipFile = new ZipFile(zipFilename,"GB2312");//处理中文乱码问题
			 Enumeration<?> en = zipFile.getEntries();
			 ZipEntry zipEntry = null;
			 while (en.hasMoreElements()) {
				 zipEntry = (ZipEntry) en.nextElement();
				 if (zipEntry.isDirectory()) {
					 // mkdir directory
					 String dirName = zipEntry.getName();
					 dirName = dirName.substring(0, dirName.length() - 1);
					 File f = new File(outFile.getPath() + File.separator + dirName);
					 f.mkdirs();
				 } else {
					 //unzip file
					 String strFilePath = outFile.getPath() + File.separator + zipEntry.getName();
					 File f = new File(strFilePath);
	
					 //////begin/////
					 //判断文件不存在的话,就创建该文件所在文件夹的目录
					 if (!f.exists()) {
						 String[] arrFolderName = zipEntry.getName().split("/");
						 String strRealFolder = "";
						 for (int i = 0; i < (arrFolderName.length - 1); i++) {
							 strRealFolder += arrFolderName[i] + File.separator;
						 }
						 strRealFolder = outFile.getPath() + File.separator + strRealFolder;
						 File tempDir = new File(strRealFolder);
						 //此处使用.mkdirs()方法,而不能用.mkdir()
						 tempDir.mkdirs();
					 }
					 //////end///
					 f.createNewFile();
					 InputStream in = zipFile.getInputStream(zipEntry);
					 FileOutputStream out = new FileOutputStream(f);
					 int c;
					 byte[] by = new byte[BUFFEREDSIZE];
					 while ((c = in.read(by)) != -1) {
						 out.write(by, 0, c);
					 }
					 //out.flush();
					 out.close();
					 in.close();
				 }
			 }
		 } catch (Exception e) {   
		    e.printStackTrace();   
		    throw e;   
		 }
	 }
	 
	/**   
     * 解压zip格式压缩包   
     * 对应的是ant.jar   
     */    
    @SuppressWarnings("unused")
	private static void unzip2(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 = "";   
                    if(fh.isUnicode()){//如果存在中文名,需要使用getFileNameW()方法,解决中文乱码问题
                    	compressFileName = fh.getFileNameW().trim();
                	}else{
                		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).toLowerCase();     
        if("zip".equals(type)){     
        	DeCompressUtil.unzip(sourceFile, destDir);     
        	//DeCompressUtil.unzip2(sourceFile, destDir);     
        }else if("rar".equals(type)){     
        	DeCompressUtil.unrar(sourceFile, destDir);     
        }else{     
            throw new Exception("只支持zip和rar格式的压缩包!");     
        }     
	}   

	 public static void main(String[] args) throws Exception {
		 try {
			 //DeCompressUtil.deCompress("E:/软件安装包/jetty-6.1.14.zip", "E:/软件安装包/jetty");
			 DeCompressUtil.deCompress("E:/软件安装包/项目/ydsys.rar", "E:/软件安装包/项目");
		 } catch (IOException e) {
			 e.printStackTrace();
		 }
	 }
}

 最近要搞一个java解压zip或者rar的功能,网上搜索了一下,在此记录,相关jar到网上下载。

分享到:
评论

相关推荐

    Java解压zip,rar,7z的jar包

    使用该jar包可对zip,rar,7z进行压缩和解压操作 使用该jar包可对zip,rar,7z进行压缩和解压操作

    java zip rar(区分有无密码的RAR文件) gz ftp工具类

    java项目中常使用到的工具类:zip压缩解压缩、rar解压(有密码的文件)、gz解压、FTP上传与下载

    JAVA解压缩ZIP或RAR格式的文件

    NULL 博文链接:https://hogwartsrow.iteye.com/blog/1853355

    解压zip压缩文件,支持多文件目录解压,中文乱码问题

    在使用Java对ZIP压缩文件进行解压的方式中有两种,一种是使用apache提供的ant.jar工具包,但是如果ZIP文件中含有中文名称的文件,在解压后,文件名将出现乱码,另一种是使用Java自身JDK中java.util.zip包下工具类,...

    解压RAR文件代码及依赖包.rar

    学习需要下载了一些视频教程的RAR包,几百个包手工解压很不方便,JDK的工具类只能解压ZIP包,于是动手写了个小程序,批量从RAR包中解压*.avi格式的文件。代码很简单,所依赖的JAR包全部提供,需要的可以下,随手写的...

    7-Zip解压缩工具.rar

    7-Zip is free software with open source.The most of the code is under the GNU LGPL license

    7zip压缩解压工具

    7zip支持我们所能见到的绝大部分格式压缩包(包括zip、rar、gz、tar、bz2……)的解压,同时能将数据压缩成zip、7z、tar等格式,完全能满足绝大多数场合的数据压缩解压需要。但与常用但需要注册的winrar、winzip之类...

    压缩、解压工具类

    里面包含libp7zip.so文件,通过java工具类调用该so文件实现解压和压缩,libp7zip.so可解压 7z,zip,rar等市面大部分压缩文件,本应用默认设置了 7z ,自己可在源码修改解压类型。里面有说明文档,已搭建好 java调用...

    SharpCompress 解压缩zip,rar文件,解决中文乱码

    应用SharpCompress0.22开源包进行文件的解压缩(zip,rar文件),已处理中文乱码问题,例子很基础.源码环境 VS2017 15.3 .

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

    详解java解压缩zip和rar的工具类使用教程直接上代码 package decompress;  import java.io.File;  import java.io.FileOutputStream;  import org.apache.tools.ant.Project;  import org.apache.tools.ant...

    android解压压缩包工具类

    这个类型实现了java语法解压压缩包的功能,可以直接导入项目调用

    文件的压缩和解压的工具类

    使用Java实现文件的压缩和解压的工具类,包括zip、tar、tar.gz、gz、rar等结尾的工具类

    vc++ 应用源码包_12

    独立打包,保证可解压,内含大量...XML文件读取及管理工具VC++源码 .rar 播放器 MM.zip 超清晰播放器源代码.zip 超旋的音乐播放器.rar 穿还原的下载者 C++源码.rar 从dll中动态装载类的源程序.rar VC满屏开满玫瑰花.zip

    MobaXterm解压即用,亲测

    ssh工具MobaXterm,可视化目录,一键粘贴等……

    vc++ 应用源码包_18

    独立打包,保证可解压,内含大量源码,网上搜集而来。一共10几包,每个包几十兆。 本包内容: 深入解析ATL(第二版)源代码资源大小.zip ...写日志log的类.zip 阳历阴历转换.rar 一个轻量级网络通信开发库源码.zip

    ZipUtil文件压缩工具类(解决中文乱码)

    java中使用ZipEntry对文件目录下的所有文件进行压缩,已解决中文乱码问题,亲测可用,请放心下载。

    vc++ 应用源码包_8

    VC++ ini文件读写操作类实例.rar VC+++暴风影音(Media+Player+Classic)源码.zip VC++版源代码统计工具 .rar VC++遍历文件夹自动生成目录树.rar vc++动态链接库编程之DLL典型实例源代码下载.rar vc++动态链接库编程...

    java文件预览功能实现,可预览zip等文件.7z

    使用spring boot打造文件文档在线预览项目解决方案,支持doc、docx、ppt、pptx、xls、xlsx、zip、rar、mp4,mp3以及众多类文本如txt、html、xml、java、properties、sql、js、md、json、conf、ini、vue、php、py、...

    Ashampoo ZIP Pro 1.0中文注册版.rar

    Ashampoo ZIP是一款免费的文件压缩解压工具,可加密文件,加密文件和文件夹为数个不同的安全格式,解密文件从所有支持的格式解密多个文件,虚拟ISO驱动器能够挂载ISO镜像到虚拟驱动器,捕捉光盘到ISO。ZIP脚本通过...

    zarchiver解压器下载 安卓版

    《ZArchiver解压工具》是一款系统安全类软件 强大的压缩/解压工具,能够解压的文件类型非常广泛。 使用ZArchiver你可以: -创建格式为:7z (7zip),zip,bzip2 (bz2),gzip (gz),XZ,tar的压缩文件; -解压缩格式为...

Global site tag (gtag.js) - Google Analytics