Java_压缩与解压工具类
Posted 杨迈1949
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
参考文章:http://www.importnew.com/14410.html
以上是关于Java_压缩与解压工具类的主要内容,如果未能解决你的问题,请参考以下文章
java工具类 文件zip压缩 base64 加密,base64解密 zip解压