zip4j 1.3.2使用

参考 http://blog.csdn.net/djun100/article/details/18007099,http://blog.csdn.net/super_href/article/details/9062261,http://my.oschina.net/luckyi/blog/159606?p=1,

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
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;



public class CompressUtil {
  public static void main(String[] args) {
        CompressUtil compressUtil = new CompressUtil();
        try {
            // compressUtil.zipWithNotFolder("D:\\test\\test中文.zip", "D:\\zip\\test1.pdf","D:\\zip\\jdbc.properties");
//             compressUtil.zipWithFolder("D:\\test\\test中文.zip", "D:\\zip",true,"123456");
            // compressUtil.zipAddFolder("D:\\test\\test中文.zip", "zip1", "D:\\zip\\jdbc.properties");
            // compressUtil.splitZipIntoMultiFiles("D:\\test\\test中文.zip", "D:\\test\\split");
            // compressUtil.unzipAllFiles("D:\\test\\test中文NOp.zip", "D:\\test");
            // compressUtil.unzipSingleFile("D:\\test\\test中文NOp.zip", "D:\\test","zip\\test1.pdf");
            // compressUtil.unzipAllFiles("D:\\test\\test中文123456.zip", "D:\\test");
             compressUtil.getAllFiles("D:\\test\\test中文123456.zip");
             System.out.println("-------------------------");
            compressUtil.removeFolder("D:\\test\\test中文123456.zip", "zip/inner/");
            System.out.println("-------------------------");
            compressUtil.getAllFiles("D:\\test\\test中文123456.zip");


            System.out.println("end!");
        } catch (ZipException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    public void removeFolder(String srcZipFile, String waitDeleteFolder) throws ZipException {
        ZipFile zipFile = new ZipFile(srcZipFile);
        zipFile.setFileNameCharset(Encoding.GBK.toString());
        if (zipFile.isEncrypted()) {
            zipFile.setPassword("123456".toCharArray());
        }
        FileHeader tempFileHeander = zipFile.getFileHeader(waitDeleteFolder);
        if (tempFileHeander == null) {
            return;
        } else {
            @SuppressWarnings("unchecked")
            List<FileHeader> list = zipFile.getFileHeaders();
            List<String> waitDel=new ArrayList<>();
            for (FileHeader fileHeader : list) {
                // System.out.println(fileHeader.getFileName());
                String fileName = fileHeader.getFileName();
                if (fileName.startsWith(waitDeleteFolder) && (!fileName.equals(waitDeleteFolder))) {
//                    zipFile.removeFile(fileHeader);
//                    zipFile.removeFile(fileName);
                    waitDel.add(fileName);
                }
            }
            for(String fileName:waitDel){
                zipFile.removeFile(fileName);
            }
            zipFile.removeFile(waitDeleteFolder);
        }


    }


    /** 得到zip中包含的文件列表(目录和相对文件路径) */
    public void getAllFiles(String srcFile) throws ZipException {
        ZipFile zipFile = new ZipFile(srcFile);
        zipFile.setFileNameCharset(Encoding.GBK.toString());
        if (zipFile.isEncrypted()) {
            zipFile.setPassword("123456".toCharArray());
        }
        @SuppressWarnings("unchecked")
        List<FileHeader> list = zipFile.getFileHeaders();
        for (FileHeader fileHeader : list) {
            System.out.println(fileHeader.getFileName());
        }
    }


    public void unzipAllFiles(String srcFile, String descFolder) throws ZipException {
        ZipFile zipFile = new ZipFile(srcFile);
        zipFile.setFileNameCharset(Encoding.GBK.toString());
        if (zipFile.isEncrypted()) {
            zipFile.setPassword("123456".toCharArray());
        }
        zipFile.extractAll(descFolder);
    }


    public void unzipSingleFile(String srcFile, String descFolder, String fileName) throws ZipException {
        ZipFile zipFile = new ZipFile(srcFile);
        if (zipFile.isEncrypted()) {
            zipFile.setPassword("123456");
        }
        zipFile.setFileNameCharset(Encoding.GBK.toString());
        zipFile.extractFile(fileName, descFolder);
    }


    /** 注意这种方式,rar不能解压,报错压缩文件损坏 */
    public void splitZipIntoMultiFiles(String srcZipFile, String destFileName) throws ZipException {
        ZipFile zipFile = new ZipFile(destFileName);
        // split length cannot less than minimum allowed split length of 65536 Bytes
        zipFile.createZipFile(new File(srcZipFile),
                getZipPara(Zip4jConstants.COMP_DEFLATE, Zip4jConstants.DEFLATE_LEVEL_NORMAL), false, 65537);
    }


    public void zipAddFolder(String destFile, String folder, String file) throws ZipException {
        ZipFile zipFile = new ZipFile(destFile);
        zipFile.setFileNameCharset(Encoding.GBK.toString());
        ZipParameters zipParameters = getZipPara(Zip4jConstants.COMP_DEFLATE, Zip4jConstants.DEFLATE_LEVEL_NORMAL);
        zipParameters.setRootFolderInZip(folder);
        zipFile.addFile(new File(file), zipParameters);
    }


    /** zip文件若已存在,则添加 */
    public void zipWithFolder(String destFile, String folder, boolean isEncrypt, String passwd) throws ZipException {
        ZipFile zipFile = new ZipFile(destFile);
        zipFile.setFileNameCharset(Encoding.GBK.toString());
        ZipParameters zipParameters = getZipPara(Zip4jConstants.COMP_DEFLATE, Zip4jConstants.DEFLATE_LEVEL_NORMAL);
        if (isEncrypt) {
            zipParameters.setEncryptFiles(true);
            zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); // 加密方式
            zipParameters.setPassword(passwd.toCharArray());
            // zipFile.setPassword("123456");
        }
        zipFile.addFolder(folder, zipParameters);
    }


    /** zip文件若已存在,则添加 */
    public void zipWithNotFolder(String destFile, String... files) throws ZipException {
        ArrayList<File> fileList = new ArrayList<>();
        for (String file : files) {
            fileList.add(new File(file));
        }
        ZipFile zipFile = new ZipFile(destFile);
        zipFile.setFileNameCharset(Encoding.GBK.toString());
        zipFile.addFiles(fileList, getZipPara(Zip4jConstants.COMP_DEFLATE, Zip4jConstants.DEFLATE_LEVEL_NORMAL));
    }


    public ZipParameters getZipPara(int compMethod, int compLevel) {
        ZipParameters zipParameters = new ZipParameters();
        zipParameters.setCompressionMethod(compMethod);
        zipParameters.setCompressionLevel(compLevel);
        return zipParameters;
    }


    private enum Encoding {
        GBK, P123456;
    }
}

/** * 使用给定密码压缩指定文件或文件夹到指定位置. * <p> * dest可传最终压缩文件存放的绝对路径,也可以传存放目录,也可以传null或者"".<br /> * 如果传null或者""则将压缩文件存放在当前目录,即跟源文件同目录,压缩文件名取源文件名,以.zip为后缀;<br /> * 如果以路径分隔符(File.separator)结尾,则视为目录,压缩文件名取源文件名,以.zip为后缀,否则视为文件名. * @param src 要压缩的文件或文件夹路径 * @param dest 压缩文件存放路径 * @param isCreateDir 是否在压缩文件里创建目录,仅在压缩文件为目录时有效.<br /> * 如果为false,将直接压缩目录下文件到压缩文件. * @param passwd 压缩使用的密码 * @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败. */ public static String zip(String src, String dest, boolean isCreateDir, String passwd) { File srcFile = new File(src); ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); // 压缩方式 parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); // 压缩级别 if (!StringUtils.isEmpty(passwd)) { parameters.setEncryptFiles(true); parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); // 加密方式 parameters.setPassword(passwd.toCharArray()); } try { ZipFile zipFile = new ZipFile(dest); if (srcFile.isDirectory()) { // 如果不创建目录的话,将直接把给定目录下的文件压缩到压缩文件,即没有目录结构 if (!isCreateDir) { File [] subFiles = srcFile.listFiles(); ArrayList<File> temp = new ArrayList<File>(); Collections.addAll(temp, subFiles); zipFile.addFiles(temp, parameters); return dest; } zipFile.addFolder(srcFile, parameters); } else { zipFile.addFile(srcFile, parameters); } return dest; } catch (ZipException e) { e.printStackTrace(); } return null; } /** * 使用给定密码解压指定的ZIP压缩文件到指定目录 * <p> * 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出 * @param zipFile 指定的ZIP压缩文件 * @param dest 解压目录 * @param passwd ZIP文件的密码 * @return 解压后文件数组 为空则解压到当前目录 * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 */ public static File [] unzip(File zipFile, String dest, String passwd) throws ZipException { ZipFile zFile = new ZipFile(zipFile); zFile.setFileNameCharset("GBK"); if (!zFile.isValidZipFile()) { throw new ZipException("压缩文件不合法,可能被损坏."); } if(dest ==null || dest.equals("")){ dest = zipFile.getParentFile().getAbsolutePath(); } File destDir = new File(dest); if (destDir.isDirectory() && !destDir.exists()) { destDir.mkdir(); } if (zFile.isEncrypted()) { zFile.setPassword(passwd.toCharArray()); } zFile.extractAll(dest); List<FileHeader> headerList = zFile.getFileHeaders(); List<File> extractedFileList = new ArrayList<File>(); for(FileHeader fileHeader : headerList) { if (!fileHeader.isDirectory()) { extractedFileList.add(new File(destDir,fileHeader.getFileName())); } } File [] extractedFiles = new File[extractedFileList.size()]; extractedFileList.toArray(extractedFiles); return extractedFiles; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值