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 压缩文件夹工具类(包含解压)

java工具类 文件zip压缩 base64 加密,base64解密 zip解压

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

Java实现压缩文件与解压缩文件

压缩工具类 - ZipUtils.java

zip4j 2.x使用,Java实现文件压缩与解压,加密压缩,ZipParameters ZipFile使用