文件加密压缩、解密解压引用zip4j包


maven引入配置


 


<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>1.3.2</version>
</dependency>
 
import lombok.extern.log4j.Log4j;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

import java.io.*;
import java.net.MalformedURLException;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

/**
 * Description:文件压缩工具
 *
 * @Author: wtl
 * @Date: 2019/1/8 16:08
 */
@Log4j
public class ZipUtil {


    /**
     * Description:文件下载
     *
     * @param srcFilePath 源文件
     * @param destDir     目标路径
     * @return void
     * @Author: wtl
     * @Date: 2019/1/10 19:32
     */
    public static void download(String srcFilePath, String destDir) throws MalformedURLException {

        long startTime = System.currentTimeMillis();    //获取开始时间
        int byteread = 0;
        try {
            destDir = destDir.replace("\\","/" );
            //创建路径
            File file = new File(destDir.substring(0, destDir.lastIndexOf('/')));
            if (!file.exists()) {
                file.mkdirs();
            }
            InputStream inputStream = new FileInputStream(srcFilePath);// 文件的存放路径
            FileOutputStream outputStream = new FileOutputStream(destDir);

            byte[] buffer = new byte[1024];
            while ((byteread = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, byteread);
            }
            inputStream.close();
            outputStream.close();
            long endTime = System.currentTimeMillis();    //获取结束时间
            log.debug("下载花费时间:" + (endTime - startTime) + "ms");
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * Description:压缩并加密指定文件夹下所有文件
     * 4万个文件大概9分钟
     *
     * @param sourcePath 源文件路径
     * @param zipFilePath 目标文件路径
     * @param password 加密密码
     * @return boolean
     * @Author: wtl
     * @Date: 2019/1/11 15:24
     */
    public static void compressZipFileByPassword(String sourcePath, String zipFilePath, String password) {
        long startTime = System.currentTimeMillis();    //获取开始时间

        //判断目标文件是否存在,若存在则删除,否则压缩加密会有问题
        File file = new File(zipFilePath);
        if (file.exists()) {
            file.delete();
        }
        try {
            //创建压缩文件
            net.lingala.zip4j.core.ZipFile respFile = new net.lingala.zip4j.core.ZipFile(zipFilePath);

            //设置压缩文件参数
            ZipParameters parameters = new ZipParameters();
            //设置压缩方法
            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);

            //设置压缩级别
            //DEFLATE_LEVEL_FASTEST     - Lowest compression level but higher speed of compression
            //DEFLATE_LEVEL_FAST        - Low compression level but higher speed of compression
            //DEFLATE_LEVEL_NORMAL  - Optimal balance between compression level/speed
            //DEFLATE_LEVEL_MAXIMUM     - High compression level with a compromise of speed
            //DEFLATE_LEVEL_ULTRA       - Highest compression level but low speed
            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);

            //设置压缩文件加密
            parameters.setEncryptFiles(true);

            //设置加密方法
            parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);

            //设置aes加密强度
            parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);

            //设置密码
            parameters.setPassword(password);

            //添加文件到压缩文件
            /*respFile.addFiles (sourceFileList,parameters);*/
            respFile.addFolder(sourcePath, parameters);

        } catch (net.lingala.zip4j.exception.ZipException e) {
            throw new RuntimeException("压缩并加密文件失败",e.getCause());
        }
        long endTime = System.currentTimeMillis();    //获取结束时间
        log.warn("压缩加密花费时间:" + (endTime - startTime) + "ms");
    }

    /**
     * Description:解压带密码的压缩文件到指定目录
     * 4万个文件大概11分钟
     *
     * @param sourcePath 源文件路径
     * @param destDir 指定目录(以"\\"结尾) 
     * @param password 解密密码
     * @return boolean
     * @Author: wtl
     * @Date: 2019年1月23日 11:44:23
     */
    public static void decompressZipFileByPassword(String sourcePath, String destDir, String password) {
        long startTime = System.currentTimeMillis();    //获取开始时间

        //若指定目录不存在则创建指定目录路径
        destDir = destDir.replace("\\","/" );
        File file = new File(destDir.substring(0, destDir.lastIndexOf('/')));
        if (!file.exists()) {
            file.mkdirs();
        }
        try {
            net.lingala.zip4j.core.ZipFile zipFile = new net.lingala.zip4j.core.ZipFile(sourcePath);
            zipFile.setPassword(password);
            zipFile.extractAll(destDir);

        } catch (net.lingala.zip4j.exception.ZipException e) {
            throw new RuntimeException("解压加密文件失败",e.getCause());
        }
        long endTime = System.currentTimeMillis();    //获取结束时间
        log.warn("解压密码文件花费时间:" + (endTime - startTime) + "ms");
    }

    /**
     * Description:删除指定文件夹下所有文件
     *
     * @param path 文件路径
     * @return boolean
     * @Author: wtl
     * @Date: 2019/1/11 15:24
     */
    public static boolean deleteDir(String path) {
        File file = new File(path);
        if (!file.exists()) {//判断是否待删除目录是否存在
            return false;
        }
        //取得当前目录下所有文件和文件夹
        String[] content = file.list();
        for (String name : content) {
            File temp = new File(path, name);
            if (temp.isDirectory()) {//判断是否是目录
                deleteDir(temp.getAbsolutePath());//递归调用,删除目录里的内容
                temp.delete();//删除空目录
            } else {
                if (!temp.delete()) {//直接删除文件
                    log.warn("文件删除失败,文件名:" + name);
                }
            }
        }
        return true;
    }

    // 无加密压缩解压文件 begin

    /**
     * Description:压缩文件或文件夹
     *
     * @param srcFilePath  压缩源路径
     * @param destFilePath 压缩目的路径
     * @return void
     * @Author: wtl
     * @Date: 2019/1/9 10:17
     */
    public static void compress(String srcFilePath, String destFilePath) {

        long startTime = System.currentTimeMillis();    //获取开始时间
        File src = new File(srcFilePath);

        if (!src.exists()) {
            throw new RuntimeException(srcFilePath + "不存在");
        }
        File zipFile = new File(destFilePath);
        try {
            FileOutputStream fos = new FileOutputStream(zipFile);
            ZipOutputStream zos = new ZipOutputStream(fos);
            String baseDir = "";
            compressbyType(src, zos, baseDir);
            zos.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        long endTime = System.currentTimeMillis();    //获取结束时间
        log.warn("压缩花费时间:" + (endTime - startTime) + "ms");
    }

    /**
     * Description:按照原路径的类型就行压缩。文件路径直接把文件压缩,
     *
     * @param file         压缩源文件
     * @param outputStream 压缩目标文件
     * @param baseDir
     * @return void
     * @Author: wtl
     * @Date: 2019/1/9 10:17
     */
    private static void compressbyType(File file, ZipOutputStream outputStream, String baseDir) {
        if (!file.exists())
            return;
        /*System.out.println("压缩路径" + baseDir + file.getName());*/
        //判断文件是否是文件,如果是文件调用compressFile方法,如果是路径,则调用compressDir方法;
        if (file.isFile()) {
            //src是文件,调用此方法
            compressFile(file, outputStream, baseDir);
        } else if (file.isDirectory()) {
            //src是文件夹,调用此方法
            compressDir(file, outputStream, baseDir);
        }
    }

    /**
     * Description:压缩文件
     *
     * @param file         压缩源文件
     * @param outputStream 压缩目标文件
     * @param baseDir
     * @return void
     * @Author: wtl
     * @Date: 2019/1/9 10:17
     */
    private static void compressFile(File file, ZipOutputStream outputStream, String baseDir) {
        if (!file.exists())
            return;
        try {
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            ZipEntry entry = new ZipEntry(baseDir + file.getName());
            outputStream.putNextEntry(entry);
            int count;
            byte[] buf = new byte[1024];
            while ((count = bis.read(buf)) != -1) {
                outputStream.write(buf, 0, count);
            }
            bis.close();

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * Description:压缩文件夹
     *
     * @param dir          压缩源文件
     * @param outputStream 压缩目标文件
     * @param baseDir
     * @return void
     * @Author: wtl
     * @Date: 2019/1/9 10:17
     */
    private static void compressDir(File dir, ZipOutputStream outputStream, String baseDir) {
        if (!dir.exists())
            return;
        File[] files = dir.listFiles();
        if (files.length == 0) {
            try {
                outputStream.putNextEntry(new ZipEntry(baseDir + dir.getName() + File.separator));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        for (File file : files) {
            compressbyType(file, outputStream, baseDir + dir.getName() + File.separator);
        }
    }

    /**
     * Description:解压文件
     *
     * @param srcFilePath 待解压的zip文件路径
     * @param destDir     指定目录(以"\\"结尾) 
     * @return void
     * @Author: wtl
     * @Date: 2019/1/9 18:28
     */
    public static void decompress(String srcFilePath, String destDir) throws IOException {

        long startTime = System.currentTimeMillis();    //获取开始时间
        File zipFile = new File(srcFilePath);
        //解决中文文件夹乱码
        ZipFile zip = new ZipFile(zipFile, Charset.forName("GBK"));
        for (Enumeration<? extends ZipEntry> entries = zip.entries(); entries.hasMoreElements(); ) {
            ZipEntry entry = (ZipEntry) entries.nextElement();
            String zipEntryName = entry.getName();
            InputStream in = zip.getInputStream(entry);
            String outPath = (destDir + zipEntryName).replaceAll("\\*", "/");

            // 判断路径是否存在,不存在则创建文件路径  
            File file = new File(outPath.substring(0, outPath.lastIndexOf('\\')));
            if (!file.exists()) {
                file.mkdirs();
            }
            // 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压  
            if (new File(outPath).isDirectory()) {
                continue;
            }

            FileOutputStream out = new FileOutputStream(outPath);
            byte[] buf1 = new byte[1024];
            int len;
            while ((len = in.read(buf1)) > 0) {
                out.write(buf1, 0, len);
            }
            in.close();
            out.close();
        }
        long endTime = System.currentTimeMillis();    //获取结束时间

        log.warn("解压完毕,花费时间:" + (endTime - startTime) + "ms");
    }

    // 无加密压缩解压文件 end
}