`

解压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实现批量解压带密码的 rar or zip 文件

    使用`java.util.zip`包中的`ZipInputStream`和`ZipEntry`类,可以读取并解压ZIP文件。以下是一个基本的解压流程: - 创建`ZipInputStream`实例,传入文件输入流。 - 循环遍历`ZipInputStream`的`ZipEntry`,获取...

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

    在Java中,处理.zip、.rar和.7z等压缩格式通常需要借助第三方库,因为Java标准库JDK并不直接支持这些格式。本文将详细介绍如何使用特定的jar包来实现对这三种压缩格式的操作。 首先,.zip格式是Java标准库支持的,...

    rar_zip解压jar包

    以下是一个简单的示例,展示如何使用Java标准库解压ZIP文件: ```java import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import ...

    zip+rar两种解压jar支持包.rar

    这个压缩包"zip+rar两种解压jar支持包"显然包含了支持在Java代码中解压ZIP和RAR格式的.jar文件的工具或库。这意味着开发者无需离开他们的编程环境,就可以直接在代码中解压这些文件,这对于测试、调试和部署过程中的...

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

    首先,对于ZIP格式的文件,Java标准库提供了`java.util.zip`包,其中的`ZipInputStream`和`ZipOutputStream`类可以用来读取和写入ZIP文件。以下是解压缩ZIP文件的基本步骤: 1. 创建一个`FileInputStream`对象,...

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

    本文将详细介绍标题和描述中提到的几个关键知识点:Java中的zip、rar(包括处理带密码的RAR文件)、gz压缩,以及FTP工具类的使用。 1. **Java ZIP压缩与解压缩**: Java内置的`java.util.zip`包提供了处理ZIP文件...

    java实现的解压与压缩 zip和rar类型的

    本文将深入探讨如何使用Java实现ZIP和RAR类型的压缩与解压操作,以及相关知识点。 首先,我们来看ZIP文件格式。ZIP是一种广泛使用的文件压缩格式,其在Java中的处理主要通过`java.util.zip`包。这个包提供了多个类...

    RAR解压工具,加密的RAR文件也能解压

    "RAR解压工具"指的是能够处理RAR文件的软件,这类工具不仅能够对RAR文件进行解压缩,还可能支持其他压缩格式,如ZIP、7Z等。 对于描述中提到的"加密的RAR文件也能解压",这意味着该解压工具具有处理密码保护的RAR...

    华为固件包解压工具和img解压工具.rar

    img解压工具能够将这类文件解析并写入到合适的存储介质上,如SD卡或内部存储。img文件的处理通常包括: 1. 验证img文件:检查文件的校验和,确认其有效性。 2. 打开img文件:使用特定工具(如dd命令或img解压软件)...

    7-Zip解压缩工具.rar

    同时,7-Zip还支持解压如RAR、ZIP、7Z、GZ、BZ2、XZ等众多常见压缩格式,几乎涵盖了日常使用的所有压缩需求。 除了强大的压缩功能,7-Zip的用户界面简洁易用,无论是初学者还是经验丰富的用户都能快速上手。在...

    解压zip包,递归复制文件.rar_C#_YTRN_sideslet_zip_递归

    首先,让我们了解一下如何使用ICSharpCode.SharpZipLib来解压ZIP文件。这个过程通常包括以下步骤: 1. **加载ZIP文件**:通过`FileStream`打开ZIP文件,然后使用`ZipFile`类的构造函数加载ZIP文件内容。 ```csharp...

    VB FSO 压缩解压 ZIP例子.rar

    以下是关于如何在VB中使用FSO和相关工具进行ZIP压缩和解压的详细知识点: 1. **引入相关组件**:首先,你需要在VB项目中引用“Microsoft Scripting Runtime”和“Microsoft ActiveX Data Objects”库。这两个库提供...

    利用ant.jar解压缩zip包

    在IT行业中,我们经常需要处理各种类型的压缩文件,如ZIP、RAR等。这些文件通常用于存储和传输大量的数据,以减少文件的体积。在Java环境中,有一种高效且强大的工具可以帮助我们进行压缩和解压缩操作,那就是Apache...

    Wince下rar/zip文件压缩解压源码

    总之,"Wince下rar/zip文件压缩解压源码"涵盖了在嵌入式系统中处理RAR和ZIP文件的核心技术,包括文件压缩、解压缩算法的实现,以及读取和解析压缩文件的结构。开发者可以通过这个源码学习到如何在资源受限的环境中...

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

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

    网站空间zip格式解压工具

    该工具的出现,旨在简化这一过程,让用户能够直接在线解压ZIP压缩包,提高工作效率。 首先,我们要理解什么是ZIP格式。ZIP是一种广泛使用的文件压缩格式,由Phil Katz在1989年创建。它允许将多个文件和文件夹打包到...

    7-zip打包工具

    - **执行系统命令**:使用Java的Runtime类或者ProcessBuilder类,可以执行系统命令来调用7-Zip的CLI,从而在Java程序中实现压缩和解压缩操作。 4. **大数据包处理** - **分卷压缩**:7-Zip支持分卷压缩,这意味着...

    zip批量解压程序zip批量解压程序

    以下是一些关键的C#代码片段,用于批量解压ZIP文件: ```csharp using System.IO; using System.IO.Compression; void BatchUnzip(string sourceFolderPath, string destinationFolderPath) { if (!Directory....

    Java 1.7以上通用解压工具通用解压工具.rar

    Java 1.7以上版本的通用解压工具是一款适用于Java平台的软件,它能够处理多种压缩格式,如RAR、ZIP、TAR等,为开发者提供了一种方便的方式来处理压缩文件。这款工具通常由程序员用于自动化任务,例如在应用程序中...

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

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

Global site tag (gtag.js) - Google Analytics