Java

    xiaoxiao2025-01-29  10

    转载请注明出处: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

    转载请注明原文地址: https://ju.6miu.com/read-1295891.html
    最新回复(0)