前言:有时候需要对很多文件进行压缩,几个还好如果有100个呢对吧,为什么不借助咱们强大的java呢,所以我就写了一个可以批量压缩,支持所有压缩格式的工具类当然也支持加密和解密,下面就是工具类的代码
废话不多说直接上代码

Maven坐标

     <!--Zip4j 压缩解压工具--><!-- https://mvnrepository.com/artifact/net.lingala.zip4j/zip4j --><dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>2.9.1</version></dependency><!-- Commons—lang3工具 --><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency><!-- tools工具 --><!-- https://mvnrepository.com/artifact/org.apache.ant/ant --><dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.8.4</version></dependency><!-- slf4j日志工具 --><!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.25</version><scope>compile</scope></dependency>

工具类代码

import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.AesKeyStrength;
import net.lingala.zip4j.model.enums.EncryptionMethod;
import org.apache.commons.lang3.StringUtils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;/*** @梦汐云纤 高效批量加解密压缩 支持所有压缩格式加密压缩 支持所有压缩格式加密解压 请先普通                       压缩一次后再使用加密压缩 然后在使用解密* 支持所有压缩格式(7z / zip / zipx / rar / exe / tar / tgz / lzh / iso / gz / xz)*/
public class BatchCompression {//压缩储存文件夹名称private static final String COMPRESSED_FOLDER = "@梦汐云纤";//打印日志private static final Logger logger = LoggerFactory.getLogger(BatchDecompression.class);public static void main(String args[]) throws ZipException {//将文件路径下的所有文件夹进行压缩处理compressAllFiles("E:\\测试\\", ".7z");compressAllFiles("E:\\测试\\", ".zip");compressAllFiles("E:\\测试\\", ".rar");//将压缩好的压缩文件进行加密压缩处理 请先普通压缩一次后再使用加密压缩encryptionCompressedAllFiles("E:\\测试\\@梦汐云纤\\", ".7z", "666");encryptionCompressedAllFiles("E:\\测试\\@梦汐云纤\\", ".zip", "666");encryptionCompressedAllFiles("E:\\测试\\@梦汐云纤\\", ".rar", "666");//解压加密双层压缩 只有第一层设有密码 此方法会自动执行两次解压请勿修改字符集否则中文乱码 文件储存在源文件下的@梦汐云纤文件夹里面pressurizedEncryption("E:\\测试\\@梦汐云纤\\@梦汐云纤\\7z\\", ".7z", "666", "UTF8");pressurizedEncryption("E:\\测试\\@梦汐云纤\\@梦汐云纤\\zip\\", ".zip", "666", "UTF8");pressurizedEncryption("E:\\测试\\@梦汐云纤\\@梦汐云纤\\rar\\", ".rar", "666", "UTF8");}/*** 遍历路径下指定压缩格式获取所有文件并批量解压加密文件** @param path     文件路径* @param suffix   后缀* @param password 密码*/public static void pressurizedEncryption(String path, String suffix, String password, String charset) {//路径储存集合ArrayList<String> listFileName = new ArrayList<String>();//获取文件名称File file = new File(path);String[] names = file.list();if (names != null) {String[] completeNames = new String[names.length];for (int i = 0; i < names.length; i++) {completeNames[i] = path + names[i];}//将路径添加到listFileName 集合内listFileName.addAll(Arrays.asList(completeNames));//遍历路径并解压加密文件for (String name : listFileName) {// 指定的压缩格式                     排除名为@梦汐云纤的文件夹if (name.contains(suffix) && !name.equals(COMPRESSED_FOLDER)) {try {//调用解压加密方法uncompress(new File(name), password, suffix, charset);} catch (ZipException e) {logger.debug("压缩文件异常:{}", e.getMessage());}}}}}/*** 遍历路径下指定压缩格式获取所有文件并批量加密压缩** @param path     文件路径* @param suffix   后缀* @param password 密码*/public static void encryptionCompressedAllFiles(String path, String suffix, String password) {//路径储存集合ArrayList<String> listFileName = new ArrayList<String>();//获取文件名称File file = new File(path);String[] names = file.list();if (names != null) {String[] completeNames = new String[names.length];for (int i = 0; i < names.length; i++) {completeNames[i] = path + names[i];}//将路径添加到listFileName 集合内listFileName.addAll(Arrays.asList(completeNames));//遍历路径并加密压缩for (String name : listFileName) {// 指定的压缩格式                    排除名为@梦汐云纤的文件夹if (name.contains(suffix) && !name.equals(COMPRESSED_FOLDER)) {try {compress(new File(name), password, suffix);} catch (ZipException e) {logger.debug("压缩文件异常:{}", e.getMessage());}}}}}/*** 遍历路径下指定压缩格式获取所有文件并批量压缩** @param path   文件目录* @param suffix 后缀*/public static void compressAllFiles(String path, String suffix) {//储存路径的集合ArrayList<String> listFileName = new ArrayList<String>();//获取文件名称File file = new File(path);String[] names = file.list();if (names != null) {String[] completeNames = new String[names.length];for (int i = 0; i < names.length; i++) {completeNames[i] = path + names[i];}//将路径添加到listFileName 集合内listFileName.addAll(Arrays.asList(completeNames));//创建线程Thread[] thread = new Thread[5];//遍历路径并压缩for (String name : listFileName) {//截取要压缩的文件夹名称String fileName = name.substring(name.lastIndexOf("\\") + 1);//      排除名为@梦汐云纤的文件夹if (!fileName.equals(COMPRESSED_FOLDER)) {//调用多线程进行压缩CompressionThreadPool compressionThreadPool = new CompressionThreadPool(path, fileName, suffix);for (int i = 0; i < 5; i++) {thread[i] = new Thread(compressionThreadPool);thread[i].start();}}}}}/*** 压缩方法** @param filePath 文件目录* @param fileName 文件名称* @param suffix   后缀* @throws Exception 异常*/public static void zipCompression(String filePath, String fileName, String suffix) throws Exception {//开始时间long startTime = System.currentTimeMillis();String path = filePath + COMPRESSED_FOLDER + "\\" + fileName;//不存在则在源文件下创建名为@梦汐云纤的文件夹File file = new File(path);if (!file.exists() && !file.isDirectory()) {new File(filePath + COMPRESSED_FOLDER).mkdir();}//创建.zip文件OutputStream is = new FileOutputStream(path + suffix);//检查输出流,采用CRC32算法,保证文件的一致性CheckedOutputStream cos = new CheckedOutputStream(is, new CRC32());//创建zip文件的输出流ZipOutputStream zos = new ZipOutputStream(cos);//设置编码,防止中文乱码zos.setEncoding("GBK");//需要压缩的文件或文件夹对象file = new File(filePath + fileName);//压缩文件的具体实现函数ZipFile(zos, file, fileName, path);//关闭流zos.close();cos.close();is.close();//结束时间long endTime = System.currentTimeMillis();System.out.println("压缩成功: " + fileName + "耗时:" + (endTime - startTime) + "ms");}/*** 递归,获取需要压缩的文件夹下面的所有子文件,然后创建对应目录与文件,对文件进行压缩** @param zos      文件输出流* @param file     需要压缩的文件或文件夹对象* @param fileName 文件名称* @param path     储存压缩路径* @throws Exception*/public static void ZipFile(ZipOutputStream zos, File file, String fileName, String path) throws Exception {if (file.isDirectory()) {//创建压缩文件的目录结构zos.putNextEntry(new ZipEntry(file.getPath().substring(file.getPath().indexOf(fileName)) + File.separator));for (File f : file.listFiles()) {ZipFile(zos, f, fileName, path);}} else {//打印输出正在压缩的文件System.err.println("正在压缩文件: " + fileName + "————>" + file.getName());//创建压缩文件zos.putNextEntry(new ZipEntry(file.getPath().substring(file.getPath().indexOf(fileName))));//用字节方式读取源文件InputStream is = new FileInputStream(file.getPath());//创建一个缓存区BufferedInputStream bis = new BufferedInputStream(is);//字节数组,每次读取1024个字节byte[] b = new byte[1024];//循环读取,边读边写while (bis.read(b) != -1) {//写入压缩文件zos.write(b);}//关闭流bis.close();is.close();}}/*** 加密压缩方法** @param sourceFile 压缩源文件路径* @param password   密码*/public static void compress(File sourceFile, String password, String suffix) throws ZipException {File dir = new File(sourceFile.getParent() + "\\" + COMPRESSED_FOLDER + "\\" + File.separator + suffix.substring(suffix.lastIndexOf(".") + 1));if (!dir.exists() && !dir.isDirectory()) {new File(sourceFile.getParent() + File.separator + COMPRESSED_FOLDER + "\\" + suffix.substring(suffix.lastIndexOf(".") + 1)).mkdirs();}// 文件名String fileName = sourceFile.getName();// 文件名称(不含扩展名)String realName = fileName.substring(0, fileName.lastIndexOf("."));String targetPathname = dir.getAbsolutePath() + File.separator + realName + suffix;File targetFile = new File(targetPathname);ZipParameters zipParameters = new ZipParameters();ZipFile zipFile = new ZipFile(targetFile);// 是否加密if (StringUtils.isNotBlank(password)) {zipParameters.setEncryptFiles(true);zipParameters.setEncryptionMethod(EncryptionMethod.AES);zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256);zipFile.setPassword(password.toCharArray());}try {zipFile.addFile(sourceFile, zipParameters);logger.info("压缩成功:{}", fileName);} catch (Exception e) {logger.debug("压缩文件异常:{}", e.getMessage());}}/*** 解压加密方法** @param sourceFile 解压源文件路径* @param password   密码*/public static void uncompress(File sourceFile, String password, String suffix, String charset) throws ZipException {//文件路径String targetPath = sourceFile.getParent() + File.separator + COMPRESSED_FOLDER;File dir = new File(targetPath);if (!dir.exists() && !dir.isDirectory()) {dir.mkdir();}ZipFile zipFile = new ZipFile(sourceFile);//设置字符集防止中文乱码zipFile.setCharset(Charset.forName(charset));try {if (zipFile.isEncrypted()) {zipFile.setPassword(password.toCharArray());}zipFile.extractAll(targetPath);//解压内层压缩文件 无密码留空 设置GBK防止中文乱码pressurizedEncryption(targetPath + "\\", suffix, "", "GBK");logger.info("解压成功:{}", sourceFile.getName());} catch (ZipException e) {logger.debug("压缩文件异常:{}", e.getMessage());}}//线程池 压缩线程public static class CompressionThreadPool implements Runnable {private static String path = "";//文件路径private static String fileName = "";//文件名称private static String suffix = "";//后缀//接收参数方法public CompressionThreadPool(String path, String fileName, String suffix) {CompressionThreadPool.path = path;CompressionThreadPool.fileName = fileName;CompressionThreadPool.suffix = suffix;}public void run() {try {//调用压缩方法zipCompression(path, fileName, suffix);} catch (Exception e) {e.printStackTrace();}}}

食用方法

 public static void main(String args[]) {//将文件路径下的所有文件夹进行压缩处理compressAllFiles("E:\\测试\\", ".7z");compressAllFiles("E:\\测试\\", ".zip");compressAllFiles("E:\\测试\\", ".rar");//将压缩好的文件进行加密压缩处理 请先普通压缩一次后再使用加密压缩encryptionCompressedAllFiles("E:\\测试\\@梦汐云纤\\", ".7z", "666");encryptionCompressedAllFiles("E:\\测试\\@梦汐云纤\\", ".zip", "666");encryptionCompressedAllFiles("E:\\测试\\@梦汐云纤\\", ".rar", "666");//解压加密双层压缩 只有第一层设有密码 此方法会自动执行两次解压请勿修改字符集否则中文乱码 文件储存在源文件下的@梦汐云纤文件夹里面pressurizedEncryption("E:\\测试\\@梦汐云纤\\@梦汐云纤\\7z\\", ".7z", "666", "UTF8");pressurizedEncryption("E:\\测试\\@梦汐云纤\\@梦汐云纤\\zip\\", ".zip", "666", "UTF8");pressurizedEncryption("E:\\测试\\@梦汐云纤\\@梦汐云纤\\rar\\", ".rar", "666", "UTF8");}

测试数据


此处有两个文件夹


文件夹内可以包含任意文件

无密码压缩测试

    public static void main(String args[]) {//将文件路径下的所有文件或文件夹进行压缩处理compressAllFiles("E:\\测试\\", ".7z");compressAllFiles("E:\\测试\\", ".zip");compressAllFiles("E:\\测试\\", ".rar");}

此处多了一个文件夹

压缩文件全在里面

都可正常查看

加密压缩测试

    public static void main(String args[]) {//将压缩好的zip进行加密压缩处理encryptionCompressedAllFiles("E:\\测试\\@梦汐云纤\\", ".7z", "666");encryptionCompressedAllFiles("E:\\测试\\@梦汐云纤\\", ".zip", "666");encryptionCompressedAllFiles("E:\\测试\\@梦汐云纤\\", ".rar", "666");}


格式分类


都可正常查看和解压

解压加密测试

    public static void main(String args[]) throws ZipException {//解压加密双层压缩 只有第一层设有密码 此方法会自动执行两次解压请勿修改字符集否则中文乱码 文件储存在源文件下的@梦汐云纤文件夹里面pressurizedEncryption("E:\\测试\\@梦汐云纤\\@梦汐云纤\\7z\\", ".7z", "666", "UTF8");pressurizedEncryption("E:\\测试\\@梦汐云纤\\@梦汐云纤\\zip\\", ".zip", "666", "UTF8");pressurizedEncryption("E:\\测试\\@梦汐云纤\\@梦汐云纤\\rar\\", ".rar", "666", "UTF8");}

压缩好的分类格式


这个绿色框里面的就是解压出来的源文件,因为是双层压缩目录结果基本一样不要搞混了哦


一切正常OK,如果有什么不懂的地方可以私我
彩虹屁:✨“应是上帝打翻银河,星星掉落凡间,才有这水面波光粼粼,你的眼眸 浩瀚星辰”
如果本文对你有用的话,请点个赞再走吧,谢谢!!!

Java批量高效压缩支持加解密支持所有压缩格式(Zip/7z/rar)相关推荐

  1. linux加解密指令,Linux加解密支持模块代码总体描述

    原标题:Linux加解密支持模块代码总体描述 1.3.4. Linux内核对加密的特性支持分析Linux内核加密特性,就要要根据不同算法所表现出来的特征进行总结.以下通过分组密码.Hash函数.随机数 ...

  2. linux加密模块,Linux加解密支持模块代码详细分析之演示验证方案1实验代码及结果...

    原标题:Linux加解密支持模块代码详细分析之演示验证方案1实验代码及结果 3.1.5.实验代码 #include #include #include #include #include #inclu ...

  3. java pkcs#11读取证书加解密(初学-分享)

    java pkcs#11读取证书加解密(初学-分享) http://www.cnblogs.com/sunfb/archive/2013/02/28/2937227.html 插入USB-KEY, 想 ...

  4. 【Http】加解密 生成 X.509格式,DER编码,后缀名.cer 加密公钥证书

    1. 背景 因为遇到了问题:参考 [Https]keytool 导入证书到 本地 Exception: Input not an X.509 certificate 然后就想查查这个怎么解决搜到了如下 ...

  5. encodingaeskey java,消息体签名与加解密-开发者QA

    Q 为什么要上线消息加密功能? A 为了更好的保护用户和公众账号的信息安全. Q 接入消息加解密功能复杂吗? A 开发者接入消息加解密功能并不复杂,微信团队提供了5种语言的示例代码(包括C++.php ...

  6. Java与Winform进行AES加解密数据传输的工具类与对应关系和示例

    场景 Android+Java中使用Aes对称加密的工具类与使用: Android+Java中使用Aes对称加密的工具类与使用_霸道流氓气质的博客-CSDN博客 上面讲的Java与安卓进行数据传输时使 ...

  7. 【Bcrypt+AES】 Vue+Java前后端分离信息加解密详解和问题解决

    文章目录 1.简单介绍Bcrypt[单向hash] 2.登录服务:使用Bcrypt加密和验证 2.1 Vue前端使用Bcrypt加密 2.2 SpringBoot后端使用Bcrypt验证密码 3.简单 ...

  8. java使用ECC算法进行加解密加验签

    文章目录 前言 一.ECC是什么? 二.使用步骤 1.引入依赖 2.代码实现 总结 前言 最近做的签名应用需要用到ECC算法,需要使用ECC密钥进行加解密和加验签功能,这里就用JDK提供的包和BC进行 ...

  9. java C# objective-c AES对称加解密

    1 /** 2 * AES加解密 3 */ 4 public class AESHelper { 5 final static String AES_KEY = "43hr8fhu34b58 ...

最新文章

  1. memcached mysql 性能测试_memcached +mysql+php 测试例子
  2. c运行库、c标准库、windows API都是什么玩意
  3. Firefox火狐浏览器自用技巧汇总--以备使用--13.5.16
  4. 最全的数据结构解析与归纳
  5. cocos2d-x编程之CCScale9Sprite典型用法
  6. linux+平均磁盘请求数量_Linux 查看磁盘IO并找出占用IO读写很高的进程
  7. 汇付 支付,痛苦的接入过程
  8. C# 判断一字符串是否为合法数字(正则表达式)
  9. Asp.net网站开发架构设计要求
  10. Hyperledger Fabric Membership Service Providers (MSP)——成员服务
  11. 【前端】【labelme】labelme 保存 imageData 的 base64编码机制 —— python 源码探究与 js 实现
  12. linux-du命令详解
  13. 路由器温度测试软件,教你增强小米路由WEB管理(一)——添加CPU温度显示
  14. HTML里css画蝴蝶,纯css3制作煽动翅膀的蝴蝶的示例
  15. Python编程:使用wkhtmltopdf将html网页转成pdf文件
  16. 【python】argparse.add_argument中的action为‘store_true’使用说明
  17. 【计算机毕业设计】Java ssm高校英语四六级报名系统
  18. Java常见运算符整理
  19. 计算机二级Java考试笔记
  20. 考研英语面试可能会问到的几个常见问题

热门文章

  1. UG NX 12 创建有界平面
  2. WordPress 配置七牛云 CDN 具体操作
  3. OraDump导出套件
  4. 一些个人电脑问题记录
  5. 如何通过海外住宅代理预防Facebook账号出现关联的情况
  6. 百度坐标转WGS84
  7. 《传送门》游戏中传送机制简析
  8. 2023杭州之江中复百日誓师动员大会
  9. CTAB-GAN:高效且可行的表格数据合成
  10. oracle 审计 分区表,oracle分区表的分类及测试