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

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格式的压缩包!");

}

}

}

时间: 2024-11-05 08:59:56

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

Java解压缩zip文件

下面实现的功能是zip文件中的图像文件解压到当前目录下,用jdk自带的处理zip文件的代码处理的,但是不能处理中文名称的文件,要不然就会出错. Java代码   import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import jav

Java解压缩.zip、.tar.gz、.tar.bz2(支持中文)

本文介绍Java解压缩.zip..tar.gz..tar.bz2的方式. 对于zip文件:使用java.util.zip.ZipEntry 和 java.util.zip.ZipFile,通过设置Charset为StandardCharsets.UTF_8支持中文. 对于.tar.gz.tgz文件:可以看做先用tar打包,再使用gz进行压缩.使用commons-compress包的TarArchiveInputStream和GzipCompressorInputStream. 对于.tar.bz

Protocol Buffer技术详解(Java实例)

Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发团队中目前主要使用的开发语言就是C++.Java和Python,其中Python主要用于编写各种工具程序.然而为了保证该篇Blog的完整性和独立性,我仍然会将上一篇Blog中已经出现的内容再一次赘述,同时对于Java中特有的部分也会着重介绍.          一.生成目标语言代码.      下面

详解Java解析XML的四种方法

(1)DOM解析 DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取 和操作文档的任意部分,是W3C的官方标准 [优点] ①允许应用程序对数据和结构做出更改. ②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据. [缺点] ①通常需要加载整个XML文档来构造层次结构,消耗资源大. [解析详解] ①构建Document对象: DocumentBuilderFactory dbf = DocumentBu

详解java动态代理

生活中的代理: 比如一个明星成名了以后,是需要有一个代理的,因为太多人想找他签名,应付不来,那么这个时候代理的作用是拦截你对真正明星的访问,他可以拦截下来收点费用,再叫真正的明星过来为你签名. 程序中的代理: 1,要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理.日志.计算方法的运行时间.事务管理.等等,你准备如何做? 2,编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码 下图显示了在程序中代理的调用原理(

详解Java中代码块和继承

本文发表于个人GitHub主页,原文请移步详解Java中代码块和继承 阅读. 概念 1.代码块 局部代码块 用于限定变量生命周期,及早释放,提高内存利用率 静态代码块 对类的数据进行初始化,仅仅只执行一次. 构造代码块 把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块. 2.继承 继承是已有的类中派生出新的类,新的类能够吸收已有类的数据属性和行为,并能扩展新的功能. 代码块的执行顺序 public class Test {    public String name

详解java垃圾回收机制(转)及finalize方法(转)

详细介绍Java垃圾回收机制 垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变.垃圾收集的目的在于清除不再使用的对象.GC通过确定对象是否被活动对象引用来确定是否收集该对象.GC首先要判断该对象是否是时候可以收集.两种常用的方法是引用计数和对象引用遍历. 引用计数收集器 引用计数是垃圾收集器中的早期策略.在这种方法中,堆中每个对象(不是

Java学习之道:详解Java解析XML的四种方法

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transform

【Java】详解Java解析XML的四种方法

XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法. AD: XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XS