Java_压缩与解压工具类

来源:互联网 发布:mac os 恢复 编辑:程序博客网 时间:2024/06/05 20:09

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

0 0
原创粉丝点击