Java_压缩与解压工具类
转载请注明出处: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
}
}
}
Java_压缩与解压工具类的更多相关文章
- 文件压缩、解压工具类。文件压缩格式为zip
package com.JUtils.file; import java.io.BufferedOutputStream; import java.io.File; import java.io.Fi ...
- GZip 压缩解压 工具类 [ GZipUtil ]
片段 1 片段 2 pom.xml <dependency> <groupId>commons-codec</groupId> <artifactId> ...
- Zip包解压工具类
最近在做项目的自动检测离线升级,使用到了解压zip包的操作,本着拿来主义精神,搞了个工具类(同事那边拿的),用着还不错. package com.winning.polaris.admin.utils ...
- zip文件解压工具类
java解压zip文件 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io. ...
- Linux打包压缩解压工具
第1章 Linux 打包压缩解压工具一.压缩.解压工具 compress/uncompress gzip/gunzip bzip2/bunzip2/ bzcat xz/unxz/ xzcat ...
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
XML序列化 #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...
- 文件操作工具类: 文件/目录的创建、删除、移动、复制、zip压缩与解压.
FileOperationUtils.java package com.xnl.utils; import java.io.BufferedInputStream; import java.io.Bu ...
- 使用SharpZIpLib写的压缩解压操作类
使用SharpZIpLib写的压缩解压操作类,已测试. public class ZipHelper { /// <summary> /// 压缩文件 /// </summary&g ...
- Android 打造自己的个性化应用(五):仿墨迹天气实现续--> 使用Ant实现zip/tar的压缩与解压
上一篇中提到对于Zip包的解压和压缩需要借助Ant 实现,我经过参考了其他的资料,整理后并加上了一些自己的看法: 这里就具体地讲下如何使用Ant进行解压缩及其原因: java中实际是提供了对 zip ...
随机推荐
- linux cmd cp -a
cp -a 在保留原文件属性的前提下复制文件 cp -r dirname destdir 复制目录后其文件属性会发生变化 想要使得复制之后的目录和原目录完全一样,可以使用cp -a dirn ...
- fatfs的设置
官方网址:file:///E:/%E5%8D%95%E7%89%87%E6%9C%BA/FATFS/ff13a/documents/doc/config.html 关于多个文件同时打开的配置::在ff ...
- 【z05】聪明的质检员
[题目链接]:http://noi.qz5z.com/viewtask.asp?id=z05 [题解] 显然w越大,最后的Y也就越大; 可以依靠这个搞二分: 如果二分枚举的tw得到的Y比S小,则减小t ...
- js cookie创建读取删除函数封装
js cookie创建读取删除函数封装 一.总结 都是为了方便操作,这样弄了很方便 1.创建cookie的函数封装的作用:方便设置过期时间expire,方便设置键和值 2.查询cookie的数据封装的 ...
- VS2010制作dll
一.为什么需要dll 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,如ATL.M ...
- 使用UIDataDetectorTypes自己主动检測电话、网址和邮箱
支付宝公布最新版本号9.0.再一次引发一场撕逼大战.微信说支付宝抄袭了它.支付宝说微信一直都在抄袭自己.在我看来.微信和支付宝都抄袭了对方.对于大佬们的抄袭.我们也是司空见惯了. 支付宝这一次更新,真 ...
- 《SPA设计与架构》之认识SPA
原文 简书原文:https://www.jianshu.com/p/84323f530223 大纲 前言 1.什么是单页面应用程序(SPA) 2.SPA与传统Web应用的区别 3.关于SPA的使用 4 ...
- [Vue] Build Vue.js Apps with the Vue-CLI and Nuxt.js
The vue-cli allows you to easily start up Vue projects from the command line while Nuxt.js enables a ...
- 最简单的基于FFmpeg的AVUtil样例 (AVLog, AVOption等)
本文的演示样例程序记录了FFmpeg的libavutil中几种工具函数的用法: AVLog:日志输出AVOption (AVClass):选项设置AVDictionary:键值对存储ParseUtil ...
- 学习金字塔 分类: T_TALENT 2014-05-21 09:25 331人阅读 评论(0) 收藏
学习金字塔是美国缅因州的国家训练实验室研究成果,它用数字形式形象显示了:采用不同的学习方式,学习者在两周以后还能记住内容(平均学习保持率)的多少.它是一种现代学习方式的理论.最早它是由美国学者.著名的 ...