java 操作Zip文件(压缩、解压、加密)

java 操作Zip文件(压缩、解压、加密)

依赖:点击下载

package com.zxl.test;

import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.tools.zip.ZipFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class FileZipUtils {

    private static Logger logger = LoggerFactory.getLogger(FileZipUtils.class);

    public static void main(String[] args) {
        // 解压
//        unZipFiles("C:\\Users\\Administrator\\Desktop\\脱敏测试.zip","C:\\Users\\Administrator\\Desktop\\");
        // 压缩
//        zipFiles("C:\\Users\\Administrator\\Desktop\\脱敏测试\\","C:\\Users\\Administrator\\Desktop\\脱敏测试压缩.zip");
        // 加密
        zipEncrypt("C:\\Users\\Administrator\\Desktop\\脱敏测试压缩.zip","C:\\Users\\Administrator\\Desktop\\脱敏测试压缩加密.zip","123");
    }

    /**
     * 压缩文件目录
     * @param source 源文件目录(单个文件和多层目录)
     * @param destit 目标目录
     */
    public static void zipFiles(String source,String destit) {
        File file = new File( source );
        ZipOutputStream zipOutputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream( destit );
            zipOutputStream = new ZipOutputStream( fileOutputStream );
            if (file.isDirectory()) {
                directory( zipOutputStream, file, "" );
            }
            logger.debug("文件压缩成功!");
        } catch (Exception e) {
            logger.debug("文件压缩失败!");
            e.printStackTrace();
        } finally {
            try {
                zipOutputStream.close();
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 解压缩ZIP文件,将ZIP文件里的内容解压到descFileName目录下
     * @param zipFileName 需要解压的ZIP文件
     * @param descFileName 目标目录
     */
    public static boolean unZipFiles(String zipFileName, String descFileName) {
        String descFileNames = descFileName;
        if (!descFileNames.endsWith(File.separator)) {
            descFileNames = descFileNames + File.separator;
        }
        try {
            // 根据ZIP文件创建ZipFile对象
            ZipFile zipFile = new ZipFile(zipFileName);
            org.apache.tools.zip.ZipEntry entry = null;
            String entryName = null;
            String descFileDir = null;
            byte[] buf = new byte[4096];
            int readByte = 0;
            // 获取ZIP文件里所有的entry
            @SuppressWarnings("rawtypes")
            Enumeration enums = zipFile.getEntries();
            // 遍历所有entry
            while (enums.hasMoreElements()) {
                entry = (org.apache.tools.zip.ZipEntry) enums.nextElement();
                // 获得entry的名字
                entryName = entry.getName();
                descFileDir = descFileNames + entryName;
                if (entry.isDirectory()) {
                    // 如果entry是一个目录,则创建目录
                    new File(descFileDir).mkdirs();
                    continue;
                } else {
                    // 如果entry是一个文件,则创建父目录
                    new File(descFileDir).getParentFile().mkdirs();
                }
                File file = new File(descFileDir);
                // 打开文件输出流
                OutputStream os = new FileOutputStream(file);
                // 从ZipFile对象中打开entry的输入流
                InputStream is = zipFile.getInputStream(entry);
                while ((readByte = is.read(buf)) != -1) {
                    os.write(buf, 0, readByte);
                }
                os.close();
                is.close();
            }
            zipFile.close();
            logger.debug("文件解压成功!");
            return true;
        } catch (Exception e) {
            logger.debug("文件解压失败:" + e.getMessage());
            return false;
        }
    }

    /**
     * zip包加密
     * @param filePath 要加密的zip文件
     * @param savePath 加密后的zip文件
     * @param password 密码
     * @return
     */
    private static boolean zipEncrypt(String filePath, String savePath, String password) {
        String zipFolder = FilenameUtils.getFullPath(filePath) + File.separator +FilenameUtils.getBaseName(savePath);
        logger.debug("解压文件:{}",filePath);
        logger.debug("解压目录:{}",zipFolder);
        try {
            FileZipUtils.unZipFiles(filePath,zipFolder);
            net.lingala.zip4j.core.ZipFile zipFile = new net.lingala.zip4j.core.ZipFile(savePath);
            //设置压缩文件参数
            ZipParameters parameters = new ZipParameters();
            //设置压缩方法
            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            //设置压缩级别
            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
            //是否加密
            parameters.setEncryptFiles(true);
            //设置密码
            parameters.setPassword(password);
            //加密方法
            parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
            设置aes加密强度
            parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
            //添加文件到压缩文件
            zipFile.addFolder(zipFolder,parameters);
            FileZipUtils.deleteFolder(zipFolder);
            logger.debug("加密成功!");
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("对【{}】文件加密处理异常:{}",filePath,e.getMessage());
            return false;
        }
    }

    /**
     * 递归压缩目录结构
     * @param zipOutputStream
     * @param file
     * @param parentFileName
     */
    private static void directory(ZipOutputStream zipOutputStream,File file,String parentFileName){
        File[] files = file.listFiles();
        String parentFileNameTemp = null;
        for (File fileTemp: files) {
            parentFileNameTemp =  StringUtils.isEmpty(parentFileName)?fileTemp.getName():parentFileName+"/"+fileTemp.getName();
            if(fileTemp.isDirectory()){
                directory(zipOutputStream,fileTemp, parentFileNameTemp);
            }else{
                zipFile(zipOutputStream,fileTemp,parentFileNameTemp);
            }
        }
    }

    private static void zipFile(ZipOutputStream zipOutputStream, File file, String parentFileName){
        FileInputStream in = null;
        try {
            ZipEntry zipEntry = new ZipEntry( parentFileName);
            zipOutputStream.putNextEntry( zipEntry );
            in = new FileInputStream( file);
            int len;
            byte [] buf = new byte[8*1024];
            while ((len = in.read(buf)) != -1){
                zipOutputStream.write(buf, 0, len);
            }
            zipOutputStream.closeEntry(  );
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try{
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    // 删除目录
    public static boolean deleteFolder(String folderPath){
        File file = new File(folderPath);
        if (file.isDirectory()){
            File[] files = file.listFiles();
            for (File file1 : files) {
                if (file1.isFile()){
                    file1.delete();
                }else if (file1.isDirectory()){
                    deleteFolder(file1.getAbsolutePath());
                }
            }
            file.delete();
        }
        return file.exists() ? false : true;
    }

}

你可能感兴趣的:(工具,zip压缩,zip解压,zip加密,java)