zip4j之加压解压

Posted learcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zip4j之加压解压相关的知识,希望对你有一定的参考价值。

最近看同事搞个文件打包,搞了大半天,还是有问题!嗨~~

网上明明有现成的,偏偏要自己写!

 

下面是基于zip4j实现加压解决的简单工具类

 

package com.learcher.zip;

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

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

/**
 * @Code<code>ZipUtils</code>
 * @Comments
 *       <p>在线加压zip与解压zip</p>
 *       <p>依赖第三方jar包:zip4j_1.3.2.jar</p>
 *       <p>jar 来源:http://maven.outofmemory.cn/net.lingala.zip4j/zip4j/1.3.2/
 * @CreateDate 2017-10-14 下午3:23:02
 * @author   learcher
 * @modifyDate 
 * @modifier
 * @version  1.0a
 * @since    jdk1.6
 */
public class ZipUtils {
    
    /**
     *     解压密码
     */
    private static String PASSWORD="";
    
    public static void main(String[] args) throws ZipException {
        String zipFromFile = "E:/temp/tmp/需要压缩的文件或目录";
        String zipToFile = "E:/temp/tmp/压缩后的文件地址.zip";
        // 压缩文件夹或文件到指定目录下
        ZipUtils.zip(zipFromFile, zipToFile); 
//        ZipUtils.zip(zipFromFile, zipToFile, true);
//        ZipUtils.zip(zipFromFile, zipToFile, "password");
        
        String unZipFromFile = "E:/temp/tmp/需要加压文件.zip";
        String unZipToPath = "E:/temp/tmp/加压后存放目录";
        // 解压文件到指定目录
//        ZipUtils.unZip(unZipFromFile);
//        ZipUtils.unZip(unZipFromFile, unZipToPath);  
//        ZipUtils.unZip(unZipFromFile, unZipToPath, "password");
        
    }
    
    /**
     * @createDate:2017-10-14 下午4:50:03
     * @author:  learcher
     * @Description:
     *            <p>加压ZIP文件</p>
     * @param fromFile -> 需要加压的ZIP文件地址
     */
    public static void unZip(String fromFile){
        File file = new File(fromFile);
        doUnZip(file, file.getParent());
    }
    
    /**
     * @createDate:2017-10-14 下午4:50:55
     * @author:  learcher
     * @Description:
     *            <p>加压ZIP文件</p>
     * @param fromFile -> 需要加压的ZIP文件地址
     * @param toPath -> 加压后的文件存放地址
     */
    public static void unZip(String fromFile, String toPath){
        if (toPath == null || "".equals(toPath.trim())){
            unZip(fromFile);
        }else{
            doUnZip(new File(fromFile), toPath);
        }
    }

    /**
     * @createDate:2017-10-14 下午4:51:17
     * @author:  learcher
     * @Description:
     *            <p>加压ZIP文件</p>
     * @param fromFile -> 需要加压的ZIP文件地址
     * @param toPath -> 加压后的文件存放地址
     * @param Password -> 解压密码
     */
    public static void unZip(String fromFile, String toPath, String Password) {
        PASSWORD = Password;
        unZip(fromFile, toPath);
    }
    
    /**
     * @createDate:2017-10-14 下午4:48:00
     * @author:  learcher
     * @Description:
     *            <p>解压ZIP文件</p>
     * @param fromFile -> 需要加压 的zip文件
     * @param toPath -> 加压后存放的目录
     */
    private static void doUnZip(File fromFile, String toPath){
        try{
            ZipFile zipFile = new ZipFile(fromFile);  
            zipFile.setFileNameCharset("GBK");
            if (!zipFile.isValidZipFile()) {
                throw new ZipException("文件不合法或不存在!");
            }
            checkEncrypted(zipFile);
            List<FileHeader> fileHeaderList = zipFile.getFileHeaders();  
            for (int i = 0; i < fileHeaderList.size(); i++) {  
                FileHeader fileHeader = fileHeaderList.get(i);  
                zipFile.extractFile(fileHeader, toPath);  
            }  
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * @createDate:2017-10-14 下午4:15:36
     * @author:  learcher
     * @Description:
     *            <p>检查加压是否需要密码</p>
     */
    private static void checkEncrypted(ZipFile zip) throws ZipException {
        if (zip.isEncrypted()) {
            zip.setPassword(PASSWORD);
        }
    }
    
    /**
     * @createDate 2017-10-14 下午5:36:17
     * @author  learcher
     * @Description
     *            <p>把文件fromFile压缩为toFile</p>
     * @param fromFile -> 需要进行压缩的文件或文件夹地址(完整路径)
     * @param toFile -> 压缩后的文件(完整路径)
     */
    public static void zip(String fromFile, String toFile){
        zip(fromFile, toFile, true);
    }
    
    /**
     * @createDate 2017-10-14 下午5:36:17
     * @author  learcher
     * @Description
     *            <p>把文件fromFile压缩为toFile</p>
     * @param fromFile -> 需要进行压缩的文件或文件夹地址(完整路径)
     * @param toFile -> 压缩后的文件(完整路径)
     * @param password -> 设置解密密码,注:该密码最对文件控制
     */
    public static void zip(String fromFile, String toFile, String password){
        PASSWORD = password;
        zip(fromFile, toFile, true);
    }
    
    /**
     * @createDate 2017-10-14 下午5:36:17
     * @author  learcher
     * @Description
     *            <p>把文件fromFile压缩为toFile</p>
     *            <p>注:如果不覆盖,则会继续将新文件写入原有的zip包中</p>
     * @param fromFile -> 需要进行压缩的文件或文件夹地址(完整路径)
     * @param toFile -> 压缩后的文件(完整路径)
     * @param cover -> 是否覆盖原有文件,true=覆盖
     */
    public static void zip(String fromFile, String toFile, boolean cover){
        File zipFile = new File(toFile);
        if (!zipFile.getParentFile().exists()) {
            zipFile.getParentFile().mkdirs();
        }
        if (zipFile.exists() && cover) {
            zipFile.delete(); // 覆盖原有 文件
        }
        doZip(new File(fromFile), toFile);
    }
    
    /**
     * @createDate 2017-10-14 下午5:33:44
     * @author  learcher
     * @Description
     *            <p>把文件fromFile压缩为toFile</p>
     * @param fromFile -> 需要进行压缩的文件或文件夹地址(完整路径)
     * @param toFile -> 压缩后的文件(完整路径)
     */
    private static void doZip(File fromFile, String toFile){
        try {
            ZipFile zip=new ZipFile(toFile); 
            zip.setFileNameCharset("GBK");
            ZipParameters param = new ZipParameters();
            // 设置压缩方式(默认方式)
            param.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            // 设置压缩级别
            param.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
            setupPassword(param);
            if (fromFile.isFile()){
                zip.addFile(fromFile, param);
            }else{
                zip.addFolder(fromFile, param);
            }
        } catch (ZipException e) {
            e.printStackTrace();
        }
    }

    /**
     * @createDate:2017-10-14 下午5:13:41
     * @author:  learcher
     * @Description:
     *            <p>设置解压密码</p>
     * @param param -> ZipParameters 参数对象
     */
    private static void setupPassword(ZipParameters param) {
        if (PASSWORD != null && !"".equals(PASSWORD.trim())){
            // 设置加密文件
            param.setEncryptFiles(true);
            // 设置加密方式(必须要有加密算法)
            param.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
            // 设置秘钥长度
            param.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);  
            param.setPassword(PASSWORD);
        }
    }
}


更多信息可以去查看:http://blog.csdn.net/u011165335/article/details/50496930

 

以上是关于zip4j之加压解压的主要内容,如果未能解决你的问题,请参考以下文章

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

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

加压和解压

Egret之JSZip加压

如何解压.tar.xz

Intellij Idea 将Java项目打包成jar