(转)java解压zip rar文件实例

转自java解压zip rar文件实例



摘要: java解压zip rar文件实例

package com.tservice.mrn.common;

import java.io.*;

import java.util.Enumeration;

import org.apache.tools.ant.Project;

import org.apache.tools.ant.taskdefs.Expand;

import org.apache.tools.zip.*;

import com.github.junrar.Archive;

import com.github.junrar.rarfile.FileHeader;

public abstract class ZipUtils {

private static final int BUFFEREDSIZE = 1024;

/**

* @SuppressWarnings({ "rawtypes", "resource" }) public static String

*                     unzip(File zipFile, String unzipDir, String

*                     zipFileName) throws IOException { ZipFile zf = new

*                     ZipFile(zipFile); Enumeration enu = zf.entries();

*                     String result = ""; while (enu.hasMoreElements()) {

*                     ZipEntry entry = (ZipEntry) enu.nextElement(); String

*                     name = entry.getName(); //

*                     如果解压entry是目录,直接生成目录即可,不用写入,如果是文件,要将文件写入 String

*                     pathParent = unzipDir + "/" + zipFileName; if (!(new

*                     File(pathParent).exists())) new

*                     File(pathParent).mkdirs(); String path = pathParent +

*                     "/" + name; result = result + path + "

*                     "; File file = new File(path); if

*                     (entry.isDirectory()) { file.mkdir(); } else { //

*                     建议使用如下方式创建流和读取字节,不然会有乱码 InputStream is =

*                     zf.getInputStream(entry); byte[] buf1 = new

*                     byte[1024]; int len; if (!file.exists()) {

*                     file.getParentFile().mkdirs(); file.createNewFile();

*                     } OutputStream out = new FileOutputStream(file);

*                     while ((len = is.read(buf1)) > 0) { String buf = new

*                     String(buf1, 0, len); out.write(buf1, 0, len); } } }

*                     result = "文件解压成功,解压文件:/n" + result; return result; }

**/

/**

* 解压zip或者rar包的内容到指定的目录下,可以处理其文件夹下包含子文件夹的情况

*

* @param zipFilename

*            要解压的zip或者rar包文件

* @param outputDirectory

*            解压后存放的目录

*

*/

public static void unzipZipRar(String zipFilename, String outputDirectory)

throws Exception {

File outFile = new File(outputDirectory);

if (!outFile.exists()) {

outFile.mkdirs();

}

ZipFile zipFile = new ZipFile(zipFilename);

@SuppressWarnings("rawtypes")

Enumeration en = zipFile.getEntries();

ZipEntry zipEntry = null;

while (en.hasMoreElements()) {

zipEntry = (ZipEntry) en.nextElement();

if (zipEntry.isDirectory()) {

// mkdir directory

String dirName = zipEntry.getName();

// System.out.println("=dirName is:=" + dirName + "=end=");

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);

// 判断文件不存在的话,就创建该文件所在文件夹的目录

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();

}

// the codes remedified by can_do on 2010-07-02 =end=

f.createNewFile();

InputStream in = zipFile.getInputStream(zipEntry);

FileOutputStream out = new FileOutputStream(f);

try {

int c;

byte[] by = new byte[BUFFEREDSIZE];

while ((c = in.read(by)) != -1) {

out.write(by, 0, c);

}

// out.flush();

} catch (IOException e) {

throw e;

} finally {

out.close();

in.close();

}

}

}

}

/**

/**

* 解压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")) {

ZipUtils.unzip(sourceFile, destDir);

} else if (type.equals("rar")) {

ZipUtils.unrar(sourceFile, destDir);

} else {

throw new Exception("只支持zip和rar格式的压缩包!");

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容