Java操作zip压缩和解压缩文件工具类

package com.zhihua.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

/**
 * Java操作zip压缩和解压缩文件工具类
 * 由于直接使用java.util.zip工具包下的类,会出现中文乱码问题,所以使用ant.jar中的org.apache.tools.zip下的工具类
 * <请替换成功能描述> <br>
 * <请替换成详细描述>
 * @author caizh
 * @since [1.0.0]
 * @version [1.0.0,2017年2月6日]
 */
public class ZipUtils {

    private static byte[] _byte = new byte[1024];

    /**
     * 对.zip文件进行解压
     * <请替换成功能描述> <br>
     * <请替换成详细描述>
     * @param zipFile 解压缩文件
     * @param targetPath 压缩的目标地址
     * @return
     * @author caizh
     * @since [1.0.0]
     * @version [1.0.0,2017年2月6日]
     */
    @SuppressWarnings("rawtypes")
    public static List<File> decompressionZipFile(File zipFile,String targetPath){
        List<File> list = new ArrayList<File>();
        try{
            ZipFile _zipFile = new ZipFile(zipFile,"GBK");
            for(Enumeration entries = _zipFile.getEntries();entries.hasMoreElements();){
                ZipEntry entry = (ZipEntry) entries.nextElement();
                File _file = new File(targetPath+File.separator+entry.getName());
                if(entry.isDirectory()){
                    _file.mkdirs();
                }else{
                    File _parent = _file.getParentFile();
                    if(!_parent.exists()){
                        _parent.mkdirs();
                    }
                    InputStream _in = _zipFile.getInputStream(entry);
                    OutputStream _out = new FileOutputStream(_file);
                    int len = 0;
                    while((len=_in.read(_byte))>0){
                        _out.write(_byte, 0, len);
                    }
                    _in.close();
                    _out.flush();
                    _out.close();
                    list.add(_file);
                }
            } 
        }catch(Exception e){
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 压缩zip文件
     * <请替换成功能描述> <br>
     * <请替换成详细描述>
     * @param targetPath 压缩的目的地址 如:E:/xxx.zip
     * @param sourceFiles 压缩的源文件
     * @author caizh
     * @since [1.0.0]
     * @version [1.0.0,2017年2月6日]
     */
    public static void compressZipFile(String targetPath,List<File> sourceFiles){
        try{
            if(targetPath.endsWith(".zip")|| targetPath.endsWith(".ZIP")){
                ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(new File(targetPath)));
                zipOutStream.setEncoding("GBK");
                for (File file : sourceFiles) {
                    addSourceFile(targetPath, zipOutStream, file, "");
                }
                zipOutStream.close();
            }else{
                System.out.println("target file["+targetPath+"] is not .zip type file");
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 压缩文件 注:如果压缩文件是一个文件夹,那压缩包存放的位置不能在该文件夹下
     * <请替换成功能描述> <br>
     * <请替换成详细描述>
     * @param targetPath 压缩的目的地址
     * @param zipOutStream 
     * @param sourceFile 被压缩的文件
     * @param path 在zip中的相对路径
     * @author caizh
     * @since [1.0.0]
     * @version [1.0.0,2017年2月6日]
     * @throws IOException 
     */
    private static void addSourceFile(String targetPath,ZipOutputStream zipOutStream,File sourceFile,String path) throws IOException{
        System.out.println("begin to compression file["+sourceFile.getName()+"]");
        if(!"".equals(path) && !path.endsWith(File.separator)){
            path += File.separator;
        }
        if(!sourceFile.getPath().equals(targetPath)){
            if(sourceFile.isDirectory()){
                File[] files = sourceFile.listFiles();
                if(files.length==0){
                    zipOutStream.putNextEntry(new ZipEntry(path+sourceFile.getName()+File.separator));
                    zipOutStream.closeEntry();
                }else{
                    for(File f:files){
                        addSourceFile(targetPath, zipOutStream, f, path+sourceFile.getName());
                    }
                }
            }else{
                InputStream in = new FileInputStream(sourceFile);
                zipOutStream.putNextEntry(new ZipEntry(path+sourceFile.getName()));
                int len = 0;
                while((len=in.read(_byte))>0){
                    zipOutStream.write(_byte,0,len);
                }
                in.close();
                zipOutStream.closeEntry();
            }
        }
    }
}

测试类:

package com.zhihua.file.test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import com.zhihua.file.ZipUtils;

public class ZipUtilsTest {

    /**
     * 解压文件
     * <请替换成功能描述> <br>
     * <请替换成详细描述>
     * @author caizh
     * @since [1.0.0]
     * @version [1.0.0,2017年2月6日]
     */
    @Test
    public void decompressionZipFile(){
        String zipPath = "E:/mkdir/copy/test.zip";
        File zipFile = new File(zipPath);
        String targetPath = "E:/mkdir/zip/";
        ZipUtils.decompressionZipFile(zipFile, targetPath);
    }

    /**
     * 压缩文件
     * <请替换成功能描述> <br>
     * <请替换成详细描述>
     * @author caizh
     * @since [1.0.0]
     * @version [1.0.0,2017年2月6日]
     */
    @Test
    public void compressZipFile(){
        File f1 = new File("E:/mkdir/copy/free.ftl");
        File f2 = new File("E:/mkdir/del/login.wav");
        List<File> list = new ArrayList<File>();
        list.add(f1);
        list.add(f2);
        String targetPath = "E:/mkdir/del/compress.zip";
        ZipUtils.compressZipFile(targetPath, list);
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值