转载请注明出处:http://blog.csdn.net/y22222ly/article/details/52201675

zip压缩,解压

zip压缩与解压主要依靠java api的两个类:

ZipInputStream

ZipOutputStream

做了一个简单的封装.

使用方法:

        try {
ZipUtil.compress(getSDCard() + "zipTest", getSDCard() + "zipTest.zip");
ZipUtil.decompress(getSDCard() + "zipTest.zip", getSDCard() + "zipTestFolder");
} catch (Exception e) {
e.printStackTrace();//失败
}

工具类ZipUtil:

package com.raise.raisestudy.zip;

import android.text.TextUtils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream; /**
* zip文件加压解压原理如下
* compress @see {@link ZipOutputStream}
* * <pre>
* OutputStream os = ...
* ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(os));
* try {
* for (int i = 0; i < fileCount; ++i) {
* String filename = ...
* byte[] bytes = ...
* ZipEntry entry = new ZipEntry(filename);
* zos.putNextEntry(entry);
* zos.write(bytes);
* zos.closeEntry();
* }
* } finally {
* zos.close();
* }
* </pre>
* decompress @see {@link ZipInputStream}
* <pre>
* InputStream is = ...
* ZipInputStream zis = new ZipInputStream(new BufferedInputStream(is));
* try {
* ZipEntry ze;
* while ((ze = zis.getNextEntry()) != null) {
* ByteArrayOutputStream baos = new ByteArrayOutputStream();
* byte[] buffer = new byte[1024];
* int count;
* while ((count = zis.read(buffer)) != -1) {
* baos.write(buffer, 0, count);
* }
* String filename = ze.getName();
* byte[] bytes = baos.toByteArray();
* // do something with 'filename' and 'bytes'...
* }
* } finally {
* zis.close();
* }
* </pre>
* 支持空文件夹加压解压
* Created by raise.yang on 16/08/09.
*/
public class ZipUtil { private static final String TAG = "ZipUtil"; /**
* 解压文件到指定文件夹
*
* @param zip 源文件
* @param destPath 目标文件夹路径
* @throws Exception 解压失败
*/
public static void decompress(String zip, String destPath) throws Exception {
//参数检查
if (TextUtils.isEmpty(zip) || TextUtils.isEmpty(destPath)) {
throw new IllegalArgumentException("zip or destPath is illegal");
}
File zipFile = new File(zip);
if (!zipFile.exists()) {
throw new FileNotFoundException("zip file is not exists");
}
File destFolder = new File(destPath);
if (!destFolder.exists()) {
if (!destFolder.mkdirs()) {
throw new FileNotFoundException("destPath mkdirs is failed");
}
}
ZipInputStream zis = null;
BufferedOutputStream bos = null;
try {
zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(zip)));
ZipEntry ze;
while ((ze = zis.getNextEntry()) != null) {
//得到解压文件在当前存储的绝对路径
String filePath = destPath + File.separator + ze.getName();
if (ze.isDirectory()) {
new File(filePath).mkdirs();
} else {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count;
while ((count = zis.read(buffer)) != -1) {
baos.write(buffer, 0, count);
}
byte[] bytes = baos.toByteArray();
File entryFile = new File(filePath);
//创建父目录
if (!entryFile.getParentFile().exists()) {
if (!entryFile.getParentFile().mkdirs()) {
throw new FileNotFoundException("zip entry mkdirs is failed");
}
}
//写文件
bos = new BufferedOutputStream(new FileOutputStream(entryFile));
bos.write(bytes);
bos.flush();
} }
} finally {
closeQuietly(zis);
closeQuietly(bos);
}
} /**
* @param srcPath 源文件的绝对路径,可以为文件或文件夹
* @param destPath 目标文件的绝对路径 /sdcard/.../file_name.zip
* @throws Exception 解压失败
*/
public static void compress(String srcPath, String destPath) throws Exception {
//参数检查
if (TextUtils.isEmpty(srcPath) || TextUtils.isEmpty(destPath)) {
throw new IllegalArgumentException("srcPath or destPath is illegal");
}
File srcFile = new File(srcPath);
if (!srcFile.exists()) {
throw new FileNotFoundException("srcPath file is not exists");
}
File destFile = new File(destPath);
if (destFile.exists()) {
if (!destFile.delete()) {
throw new IllegalArgumentException("destFile is exist and do not delete.");
}
} CheckedOutputStream cos = null;
ZipOutputStream zos = null;
try {
// 对目标文件做CRC32校验,确保压缩后的zip包含CRC32值
cos = new CheckedOutputStream(new FileOutputStream(destPath), new CRC32());
//装饰一层ZipOutputStream,使用zos写入的数据就会被压缩啦
zos = new ZipOutputStream(cos);
zos.setLevel(9);//设置压缩级别 0-9,0表示不压缩,1表示压缩速度最快,9表示压缩后文件最小;默认为6,速率和空间上得到平衡。
if (srcFile.isFile()) {
compressFile("", srcFile, zos);
} else if (srcFile.isDirectory()) {
compressFolder("", srcFile, zos);
}
} finally {
closeQuietly(zos);
}
} private static void compressFolder(String prefix, File srcFolder, ZipOutputStream zos) throws IOException {
String new_prefix = prefix + srcFolder.getName() + "/";
File[] files = srcFolder.listFiles();
//支持空文件夹
if (files.length == 0) {
compressFile(prefix, srcFolder, zos);
} else {
for (File file : files) {
if (file.isFile()) {
compressFile(new_prefix, file, zos);
} else if (file.isDirectory()) {
compressFolder(new_prefix, file, zos);
}
}
}
} /**
* 压缩文件和空目录
*
* @param prefix
* @param src
* @param zos
* @throws IOException
*/
private static void compressFile(String prefix, File src, ZipOutputStream zos) throws IOException {
//若是文件,那肯定是对单个文件压缩
//ZipOutputStream在写入流之前,需要设置一个zipEntry
//注意这里传入参数为文件在zip压缩包中的路径,所以只需要传入文件名即可
String relativePath = prefix + src.getName();
if (src.isDirectory()) relativePath += "/";//处理空文件夹
ZipEntry entry = new ZipEntry(relativePath);
//写到这个zipEntry中,可以理解为一个压缩文件
zos.putNextEntry(entry);
InputStream is = null;
try {
if (src.isFile()) {
is = new FileInputStream(src);
byte[] buffer = new byte[1024 << 3];
int len = 0;
while ((len = is.read(buffer)) != -1) {
zos.write(buffer, 0, len);
}
}
//该文件写入结束
zos.closeEntry();
} finally {
closeQuietly(is);
}
} private static void closeQuietly(final Closeable closeable) {
try {
if (closeable != null) {
closeable.close();
}
} catch (final IOException ioe) {
// ignore
}
}
}

GZip压缩,解压

GZip压缩与解压主要依靠java api的两个类:

GZipInputStream

GZipOutputStream

做了一个简单的封装.

使用方法:

        try {
ZipUtil.compress(getSDCard() + "zipTest", getSDCard() + "zipTest.zip");
ZipUtil.decompress(getSDCard() + "zipTest.zip", getSDCard() + "zipTestFolder");
} catch (Exception e) {
e.printStackTrace();//失败
}

工具类GZipUtil.java

package com.raise.raisestudy.zip;

import android.text.TextUtils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream; /**
* compress @see {@link GZIPOutputStream}
* <pre>
* OutputStream os = ...
* byte[] bytes = ...
* GZIPOutputStream zos = new GZIPOutputStream(new BufferedOutputStream(os));
* try {
* zos.write(bytes);
* } finally {
* zos.close();
* }
* </pre>
* <p>
* compress @see {@link GZIPInputStream}
* <pre>
* InputStream is = ...
* GZIPInputStream zis = new GZIPInputStream(new BufferedInputStream(is));
* try {
* // Reading from 'zis' gets you the uncompressed bytes...
* processStream(zis);
* } finally {
* zis.close();
* }
* </pre>
* <p>
* Created by raise.yang on 16/08/13.
*/ public class GZipUtil { /**
* 解压文件到指定文件夹
*
* @param gzip 源文件
* @param destPath 目标文件绝对路径
* @throws Exception 解压失败
*/
public static void decompress(String gzip, String destPath) throws Exception {
//参数检查
if (TextUtils.isEmpty(gzip) || TextUtils.isEmpty(destPath)) {
throw new IllegalArgumentException("gzip or destPath is illegal");
}
File gzipFile = new File(gzip);
if (!gzipFile.exists()) {
throw new FileNotFoundException("gzip file is not exists");
}
File destFile = new File(destPath);
if (destFile.exists()) {
if (!destFile.delete()) {
throw new FileNotFoundException("destFile delete is failed");
}
} GZIPInputStream zis = null;
BufferedOutputStream bos = null;
try {
zis = new GZIPInputStream(new BufferedInputStream(new FileInputStream(gzipFile)));
bos = new BufferedOutputStream(new FileOutputStream(destPath));
byte[] buffer = new byte[1024 << 3];
int len = 0;
while ((len = zis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.flush();
} finally {
closeQuietly(zis);
closeQuietly(bos);
}
} /**
* @param srcPath
* @param destPath
* @throws Exception
*/
public static void compress(String srcPath, String destPath) throws Exception {
//参数检查
if (TextUtils.isEmpty(srcPath) || TextUtils.isEmpty(destPath)) {
throw new IllegalArgumentException("srcPath or destPath is illegal");
}
File srcFile = new File(srcPath);
if (!srcFile.exists() || srcFile.isDirectory()) {
throw new FileNotFoundException("srcPath file is not exists");
}
File destFile = new File(destPath);
if (destFile.exists()) {
if (!destFile.delete()) {
throw new IllegalArgumentException("destFile is exist and do not delete.");
}
}
GZIPOutputStream zos = null;
InputStream is = null;
try {
zos = new GZIPOutputStream(new BufferedOutputStream(new FileOutputStream(destPath)));
is = new FileInputStream(srcFile);
byte[] buffer = new byte[1024 << 3];
int len = 0;
while ((len = is.read(buffer)) != -1) {
zos.write(buffer, 0, len);
}
zos.flush();
} finally {
closeQuietly(is);
closeQuietly(zos);
}
} private static void closeQuietly(final Closeable closeable) {
try {
if (closeable != null) {
closeable.close();
}
} catch (final IOException ioe) {
// ignore
}
}
}

参考文章:http://www.importnew.com/14410.html

Java_压缩与解压工具类的更多相关文章

  1. 文件压缩、解压工具类。文件压缩格式为zip

    package com.JUtils.file; import java.io.BufferedOutputStream; import java.io.File; import java.io.Fi ...

  2. GZip 压缩解压 工具类 [ GZipUtil ]

    片段 1 片段 2 pom.xml <dependency> <groupId>commons-codec</groupId> <artifactId> ...

  3. Zip包解压工具类

    最近在做项目的自动检测离线升级,使用到了解压zip包的操作,本着拿来主义精神,搞了个工具类(同事那边拿的),用着还不错. package com.winning.polaris.admin.utils ...

  4. zip文件解压工具类

    java解压zip文件 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io. ...

  5. Linux打包压缩解压工具

    第1章      Linux 打包压缩解压工具一.压缩.解压工具 compress/uncompress gzip/gunzip bzip2/bunzip2/ bzcat xz/unxz/ xzcat ...

  6. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

  7. 文件操作工具类: 文件/目录的创建、删除、移动、复制、zip压缩与解压.

    FileOperationUtils.java package com.xnl.utils; import java.io.BufferedInputStream; import java.io.Bu ...

  8. 使用SharpZIpLib写的压缩解压操作类

    使用SharpZIpLib写的压缩解压操作类,已测试. public class ZipHelper { /// <summary> /// 压缩文件 /// </summary&g ...

  9. Android 打造自己的个性化应用(五):仿墨迹天气实现续--> 使用Ant实现zip/tar的压缩与解压

    上一篇中提到对于Zip包的解压和压缩需要借助Ant 实现,我经过参考了其他的资料,整理后并加上了一些自己的看法: 这里就具体地讲下如何使用Ant进行解压缩及其原因: java中实际是提供了对  zip ...

随机推荐

  1. HDU 1166 敌兵布阵 树状数组||线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目大意: 给定n个数的区间N<=50000,还有Q个询问(Q<=40000)求区间和. 每个 ...

  2. 加固linux

    http://linoxide.com/linux-command/password-aging-secure-linux-access/

  3. ganglia错误解决

    1.      运行: 解决: 这时重新启动gmetad,输入命令: service gmetad stop 显示: Shutting down GANGLIA gmetad:             ...

  4. netty reactor线程模型分析

    netty4线程模型 ServerBootstrap http示例 // Configure the server. EventLoopGroup bossGroup = new EpollEvent ...

  5. POJ 2479 Maximum sum POJ 2593 Max Sequence

    d(A) = max{sum(a[s1]..a[t1]) + sum(a[s2]..a[t2]) | 1<=s1<=t1<s2<=t2<=n} 即求两个子序列和的和的最大 ...

  6. 9.9 Binder系统_Java实现_Android里java程序的编译启动

    如果知道了进程号:通过ls /proc/进程号/task 可以看到所有线程    cat /proc/进程号/task/线程号/comm  可以达到线程名字(主线程是main,主线程号就是进程号) d ...

  7. .dmp文件导出使用示例

    exp导出的几种用例,先睹为快: 1 将数据库SampleDB完全导出,用户名system 密码manager 导出到E:/SampleDB.dmp中 exp system/manager@TestD ...

  8. ubuntu 14 编译视频第三方库ijkplayer,能够在winows下使用

    1.先安装相关环境,详细在这里http://blog.163.com/zhuowr2006@126/blog/static/98334653201612310647799/  依据上面那个安装之后,会 ...

  9. [Algorithms] Binary Search Algorithm using TypeScript

    (binary search trees) which form the basis of modern databases and immutable data structures. Binary ...

  10. css3-13 如何改变文本框的轮廓颜色

    css3-13 如何改变文本框的轮廓颜色 一.总结 一句话总结:outline使用和border很像,几乎一模一样,多了一个offset属性 1.轮廓outline如何使用? 使用和border很像, ...