压缩工具类,提供压缩文件、解压文件的方法。

源码如下:(点击下载 - ZipUtils.java 、FolderUtils.java、ant-1.7.0.jar、commons-io-2.4.jar、commons-lang-2.6.jar)

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream; /**
* 压缩工具类
*
*/
public class ZipUtils { private static final String DEFAULT_CHARSET = "UTF-8"; /**
* 压缩文件夹
*
* @param zipFileName
* 打包后文件的名称,含路径
* @param sourceFolder
* 需要打包的文件夹或者文件的路径
* @param zipPathName
* 打包目的文件夹名,为空则表示直接打包到根
*/
public static void zip(String zipFileName, String sourceFolder, String zipPathName) throws Exception {
ZipOutputStream out = null;
try {
File zipFile = new File(zipFileName); FolderUtils.mkdirs(zipFile.getParent());
out = new ZipOutputStream(zipFile);
out.setEncoding(DEFAULT_CHARSET);
if (StringUtils.isNotBlank(zipPathName)) {
zipPathName = FilenameUtils.normalizeNoEndSeparator(zipPathName, true) + "/";
} else {
zipPathName = "";
}
zip(out, sourceFolder, zipPathName);
} catch (IOException e) {
e.printStackTrace();
throw new Exception(e);
} finally {
IOUtils.closeQuietly(out);
}
} /**
* 压缩文件夹
*
* @param zipFile
* a {@link java.lang.String} object.
* @param source
* a {@link java.lang.String} object.
*/
public static void zip(String zipFile, String source) throws Exception {
File file = new File(source);
zip(zipFile, source, file.isFile() ? StringUtils.EMPTY : file.getName());
} /**
* 压缩文件夹
*
* @param zipFile
* a {@link java.io.File} object.
* @param source
* a {@link java.io.File} object.
*/
public static void zip(File zipFile, File source) throws Exception {
zip(zipFile.getAbsolutePath(), source.getAbsolutePath());
} private static void zip(ZipOutputStream zos, String file, String pathName) throws IOException {
File file2zip = new File(file);
if (file2zip.isFile()) {
zos.putNextEntry(new ZipEntry(pathName + file2zip.getName()));
IOUtils.copy(new FileInputStream(file2zip.getAbsolutePath()), zos);
zos.flush();
zos.closeEntry();
} else {
File[] files = file2zip.listFiles();
if (ArrayUtils.isNotEmpty(files)) {
for (File f : files) {
if (f.isDirectory()) {
zip(zos, FilenameUtils.normalizeNoEndSeparator(f.getAbsolutePath(), true),
FilenameUtils.normalizeNoEndSeparator(pathName + f.getName(), true) + "/");
} else {
zos.putNextEntry(new ZipEntry(pathName + f.getName()));
IOUtils.copy(new FileInputStream(f.getAbsolutePath()), zos);
zos.flush();
zos.closeEntry();
}
}
}
}
} /**
* 解压
*
* @param fromZipFile
* zip文件路径
* @param unzipPath
* 解压路径
*/
@SuppressWarnings("unchecked")
public static final void unzip(String fromZipFile, String unzipPath) throws Exception { FileOutputStream fos = null;
InputStream is = null;
String path1 = StringUtils.EMPTY;
String tempPath = StringUtils.EMPTY; if (!new File(unzipPath).exists()) {
new File(unzipPath).mkdir();
}
ZipFile zipFile = null;
try {
zipFile = new ZipFile(fromZipFile, DEFAULT_CHARSET);
} catch (IOException e1) {
e1.printStackTrace();
throw new Exception(e1);
}
File temp = new File(unzipPath);
String strPath = temp.getAbsolutePath();
Enumeration<ZipEntry> enu = zipFile.getEntries();
ZipEntry zipEntry = null;
while (enu.hasMoreElements()) {
zipEntry = (ZipEntry) enu.nextElement();
path1 = zipEntry.getName();
if (zipEntry.isDirectory()) {
tempPath = FilenameUtils.normalizeNoEndSeparator(strPath + File.separator + path1, true);
File dir = new File(tempPath);
dir.mkdirs();
continue;
} else { BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
is = zipFile.getInputStream(zipEntry);
bis = new BufferedInputStream(is);
path1 = zipEntry.getName();
tempPath = FilenameUtils.normalizeNoEndSeparator(strPath + File.separator + path1, true);
FolderUtils.mkdirs(new File(tempPath).getParent());
fos = new FileOutputStream(tempPath);
bos = new BufferedOutputStream(fos); IOUtils.copy(bis, bos);
} catch (IOException e) {
e.printStackTrace();
throw new Exception(e);
} finally {
IOUtils.closeQuietly(bis);
IOUtils.closeQuietly(bos);
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(fos);
}
}
}
}
}

压缩工具类 - ZipUtils.java的更多相关文章

  1. Java 实现文件压缩工具类

    package com.wdxc.util; import java.io.BufferedInputStream; import java.io.File; import java.io.FileI ...

  2. 【C#】依赖于SharpZipLib的Zip压缩工具类

    上班第二天下班,课外作业,实现一个ZIP压缩的工具类.本来想用Package,但是写完了才发现不能解压其他工具压缩的zip包,比较麻烦,因此本工具类依赖了第三方的库(SharpZipLib  vers ...

  3. 最近工作用到压缩,写一个zip压缩工具类

    package test; import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream ...

  4. 使用 Arrays 类操作 Java 中的数组

    Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索等(关于类和方法的相关内容在后面的章节中会详细讲解滴 ...

  5. 慕课网-Java入门第一季-6-7 使用 Arrays 类操作 Java 中的数组

    来源:http://www.imooc.com/code/1556 Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现 ...

  6. java能不能自己写一个类叫java.lang.System/String正确答案

    原文: http://www.wfuyu.com/php/22254.html 未做测试 ! 最近学习了下java类加载相干的知识.然后看到网上有1道面试题是 能不能自己写个类叫java.lang.S ...

  7. hadoop中Text类 与 java中String类的区别

    hadoop 中 的Text类与java中的String类感觉上用法是相似的,但两者在编码格式和访问方式上还是有些差别的,要说明这个问题,首先得了解几个概念: 字符集: 是一个系统支持的所有抽象字符的 ...

  8. Arrays 类操作 Java 的数组排序

    使用 Arrays 类操作 Java 中的数组 Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索等( ...

  9. Java日期工具类,Java时间工具类,Java时间格式化

    Java日期工具类,Java时间工具类,Java时间格式化 >>>>>>>>>>>>>>>>>&g ...

随机推荐

  1. BZOJ 2820 YY的GCD

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2820 有种方法是枚举质数然后用BZOJ2301来做但是超时了... 具体式子大概张这样: ...

  2. ios 缓存相关信息收集

    链接:http://www.cnblogs.com/pengyingh/category/353093.html 使用NSURLCache让本地数据来代替远程UIWebView请求 摘要: 原文作者: ...

  3. Javascript引擎单线程机制及setTimeout执行原理说明

    setTimeout用法在实际项目中还是会时常遇到.比如浏览器会聪明的等到一个函数堆栈结束后才改变DOM,如果再这个函数堆栈中把页面背景先从白色设为红色,再设回白色,那么浏览器会认为DOM没有发生任何 ...

  4. 从maya导入物体 Importing Objects From Maya

    原地址:http://game.ceeger.com/Manual/HOWTO-ImportObjectMaya.html Unity natively imports Maya files. To ...

  5. c++中的原子操作

    1. c/c++标准中没有定义任何操作符为原子的,操作符是否原子和平台及编译器版本有关 2. GCC提供了一组内建的原子操作,这些操作是以函数的形式提供的,这些函数不需要引用任何头文件 2.1 对变量 ...

  6. 13test05:亲密数

    /*#include<iostream> using namespace std; int main() {int sum[3000]={0}; for(int i=1;i<3000 ...

  7. 充分发挥异步在 ASP.NET 中的强大优势

    作者:Brij Bhushan Mishra 最近几年,异步编程受到极大关注,主要是出于两个关键原因:首先,它有助于提供更好的用户体验,因为不会阻塞 UI 线程,避免了处理结束前出现 UI 界面挂起. ...

  8. winform中的时间轴控件

    我现在做的项目遇到一个需求,就是有没有类似的控件: 我要实现的功能是:播放录像. 某个时间段内假如有2个录像,这个坐标表示的是时间,假如我现在拖动时间轴,拖到第一个录像里面开始播放第一个录像,拖到2个 ...

  9. CSS 知识积累

    一.关于定位 1.相对定位下,不需要设定块级元素的宽度,只需要设定高度,即可以使该块级元素自适应,如果内有固定高度子元素,可以不设高度.而且可以进行top left定位. 2.相对定位下,如果两个兄弟 ...

  10. 几种CPU架构

    原文链接:http://blog.csdn.net/wyzxg/article/details/5027738 这几天在下载RPM包的时候,总会看见x86,x86-64,IA64,i386,i586等 ...