Java實(shí)現(xiàn)多文件壓縮加密并重命名壓縮文件對象的方法
更新時間:2021年01月09日 10:43:21 作者:weixin_44980116
這篇文章主要介紹了Java實(shí)現(xiàn)多文件壓縮加密并重命名壓縮文件對象的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
Java 多文件加密壓縮 添加文件加密壓縮工具包依賴
<!-- zip4j壓縮工具 --> <dependency> <groupId>net.lingala.zip4j</groupId> <artifactId>zip4j</artifactId> <version>1.3.2</version> </dependency>
話不多說,直接上干貨
完整代碼如下:
package com.rhtcms.cms.api.admin.main;
import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import java.io.*;
import java.util.*;
public class FileCompressionApiAct {
/**
* 復(fù)制壓縮文件路徑 ps:此路徑必須為空文件夾,在壓縮完成后此文件夾將被清空目錄
*/
private static String copyPath = "c:/Users/Administrator/Desktop/壓縮測試/壓縮測試作業(yè)復(fù)制";
private static long time = System.currentTimeMillis();//以時間戳作為文件名,防止重命名問題
/**
* 壓縮包路徑: 路徑+壓縮包名稱 eg: C:/Users/Administrator/Desktop/壓縮測試/ + test.zip
*/
private static String zipPath = "C:/Users/Administrator/Desktop/壓縮測試/" + time + ".zip";
/**
* 可支持的壓縮文件格式
*/
private static String[] fileType = {"doc", "docx", "pdf", "txt"};
/**
* @param filePath 壓縮文件路徑
* @param fileRename 壓縮文件重命名名稱
* @param password 加密密碼
* @return
* @Title: zipFilesAndEncrypt
* @Description: 將指定路徑下的文件壓縮至指定zip文件,并以指定密碼加密,若密碼為空,則不進(jìn)行加密保護(hù)
* @Author: 張慶裕
* @Date: 2021/01/04
*/
//@RequestMapping("/fileCompression/list")
public String zipFilesAndEncrypt(List<File> filePath, List<String> fileRename, String password) {
/**
* 壓縮成功的文件數(shù)量
*/
int successCount = 0;
/**
* 壓縮失敗的文件數(shù)量
*/
int failCount = 0;
/**
* 返回數(shù)據(jù)
*/
JSONObject ob = new JSONObject();
ArrayList<String> failFile = new ArrayList<>();//壓縮失敗的文件路徑
ArrayList<String> failFilePath = new ArrayList<>();//路徑錯誤的文件
ArrayList<File> filesToAdd = new ArrayList<>();//壓縮路徑的集合
//創(chuàng)建復(fù)制文件夾
File folder = new File(copyPath);
if(!folder.exists()){//如果文件夾不存在
boolean mkdir = folder.mkdir();//創(chuàng)建文件夾
if(!mkdir){//系統(tǒng)未找到該路徑
throw new RuntimeException("復(fù)制文件路徑出錯,請修改復(fù)制文件夾路徑");
}
}else{//文件夾存在
File[] listFiles = folder.listFiles();
if(listFiles.length > 0){//如何文件夾下存在目錄則,停止壓縮,防止刪除其他文件
throw new RuntimeException("復(fù)制的文件夾不為空,請選擇空文件夾!");
}
}
for (int i = 0; i < filePath.size(); i++) {//遍歷壓縮文件數(shù)據(jù)
File file = filePath.get(i);//獲取原文件
if (!file.exists()) {//防止文件異常,首先再次確認(rèn)文件路徑是否存在
// 文件不存在
failCount++;
failFilePath.add(file.getPath());
System.out.println("文件:" + file.getPath() + " 路徑不存在!");
ob.put("failFilePath", failFilePath);
} else {//文件存在
//獲取原文件路徑
String path = filePath.get(i).getPath();
//獲取最后一個點(diǎn)的位置
int lastIndexOf = path.lastIndexOf(".");
//獲取文件后綴 eg: txt , doc , pdf ....
String suffix = path.substring(lastIndexOf + 1);
if (Arrays.asList(fileType).contains(suffix)) { //判斷文件格式是否合格,合格添加至壓縮文件中
//獲取原文件名稱
File oldName = new File(file.getPath());
//先復(fù)制文件
File newName = new File(copyPath + "/" + file.getName());
try {
copyFile(oldName, newName);
} catch (Exception e) {
e.printStackTrace();
}
//String path = newName.getPath();//獲取復(fù)制文件的路徑
String parentPath = newName.getParent();//獲取復(fù)制出來的文件的父級目錄
String reName = fileRename.get(i);//獲取重命名的名稱
newName.renameTo(new File(parentPath + "/" + reName));//重命名復(fù)制出來的文件
filesToAdd.add(new File(parentPath + "/" + reName));//將賦值出來的文件添加到壓縮文件集合中
successCount++;//壓縮成功文件數(shù)量+1
} else {
failFile.add(file.getPath());
failCount++;//壓縮失敗文件數(shù)量+1
ob.put("filePath", failFile);
System.out.println("該文件壓縮失敗:" + file.getPath() + " 文件格式錯誤!");
}
}
}
//壓縮配置
try {
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);//壓縮方式
//設(shè)置壓縮級別
//DEFLATE_LEVEL_FASTEST - 最低壓縮級別,但壓縮速度更高
//DEFLATE_LEVEL_FAST - 低壓縮級別,但壓縮速度更高
//DEFLATE_LEVEL_NORMAL - 壓縮水平速度之間的最佳平衡
//DEFLATE_LEVEL_MAXIMUM - 高壓縮級別,但速度不佳
//DEFLATE_LEVEL_ULTRA - 最高壓縮級別但速度較低
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);//壓縮級別
if (password != null && password!="") {
parameters.setEncryptFiles(true);//設(shè)置壓縮文件加密
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);//加密方式
parameters.setPassword(password);//設(shè)置加密密碼
}
ZipFile zipFile = new ZipFile(zipPath);//創(chuàng)建壓縮路徑
zipFile.setFileNameCharset("gbk");//設(shè)置壓縮編碼
zipFile.addFiles(filesToAdd, parameters);//添加壓縮文件并進(jìn)行加密壓縮
//壓縮完成后清空復(fù)制的文件目錄
deleteDir(copyPath);
ob.put("zipPath", zipPath);
ob.put("successCount", successCount);
ob.put("failCount", failCount);
} catch (ZipException e) {
//清空復(fù)制的文件目錄
deleteDir(copyPath);
ob.put("unKnown", "未知異常,壓縮失敗!");
System.out.println("文件壓縮出錯");
e.printStackTrace();
}
return ob.toString();
}
/**
* @Description: 文件復(fù)制
* @Param: resource 原文件路徑
* @Param: target 新文件路徑
* @return:
* @Author: 張慶裕
* @Date: 2021/1/6
*/
public void copyFile(File resource, File target) throws Exception {
// 輸入流 --> 從一個目標(biāo)讀取數(shù)據(jù)
// 輸出流 --> 向一個目標(biāo)寫入數(shù)據(jù)
long start = System.currentTimeMillis();
// 文件輸入流并進(jìn)行緩沖
FileInputStream inputStream = new FileInputStream(resource);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
// 文件輸出流并進(jìn)行緩沖
FileOutputStream outputStream = new FileOutputStream(target);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
// 緩沖數(shù)組
// 大文件 可將 1024 * 2 改大一些,但是 并不是越大就越快
byte[] bytes = new byte[1024 * 2];
int len = 0;
while ((len = inputStream.read(bytes)) != -1) {
bufferedOutputStream.write(bytes, 0, len);
}
// 刷新輸出緩沖流
bufferedOutputStream.flush();
//關(guān)閉流
bufferedInputStream.close();
bufferedOutputStream.close();
inputStream.close();
outputStream.close();
long end = System.currentTimeMillis();
System.out.println("復(fù)制文件:" + resource.getPath() + " 成功 耗時:" + (end - start) / 1000 + " s");
}
/**
* @Description: 清空復(fù)制壓縮文件下的內(nèi)容
* @Param: path 復(fù)制文件夾的路徑
* @return:
* @Author: 張慶裕
* @Date: 2021/1/6
*/
public boolean deleteDir(String path) {
File file = new File(path);
if (!file.exists()) {//判斷是否待刪除目錄是否存在
System.err.println("The dir are not exists!");
return false;
}
String[] content = file.list();//取得當(dāng)前目錄下所有文件和文件夾
for (String name : content) {
File temp = new File(path, name);
if (temp.isDirectory()) {//判斷是否是目錄
deleteDir(temp.getAbsolutePath());//遞歸調(diào)用,刪除目錄里的內(nèi)容
temp.delete();//刪除空目錄
} else {
if (!temp.delete()) {//直接刪除文件
System.err.println("Failed to delete " + name);
}
}
}
return true;
}
/**
* @Description: 文件壓縮測試接口
* @Param:
* @return:
* @Author: 張慶裕
* @Date: 2021/1/7
*/
public static void main(String[] args) {
List<File> filePath = new ArrayList<>();//壓縮文件路徑
filePath.add(new File("C:/Users/Administrator/Desktop/壓縮測試/yasuo/OA平臺問題.docx"));
filePath.add(new File("C:/Users/Administrator/Desktop/壓縮測試/yasuo/OA平臺問題1.docx"));
filePath.add(new File("C:/Users/Administrator/Desktop/壓縮測試/yasuo/OA平臺問題2.docx"));
filePath.add(new File("C:/Users/Administrator/Desktop/壓縮測試/yasuo/OA平臺問題3.docx"));
filePath.add(new File("C:/Users/Administrator/Desktop/壓縮測試/yasuo/郵箱1.md"));
filePath.add(new File("C:/Users/Administrator/Desktop/壓縮測試/yasuo/郵箱2.md"));
List<String> fileRename = new ArrayList<>();//壓縮文件重命名名稱
fileRename.add("oa平臺問題.docx");
fileRename.add("oa平臺問題1.docx");
fileRename.add("oa平臺問題2.docx");
fileRename.add("oa平臺問題3.docx");
fileRename.add("郵箱副本1.md");
fileRename.add("郵箱副本2.md");
String password = "123456";//加密密碼
//請?jiān)趩卧獪y試進(jìn)行測試, 或者將方法改為 static 方法
//String result = zipFilesAndEncrypt(filePath, fileRename, password);
//System.out.println(result);
}
}
效果如下:

到此這篇關(guān)于Java實(shí)現(xiàn)多文件壓縮加密并重命名壓縮文件對象的方法的文章就介紹到這了,更多相關(guān)java多文件壓縮加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java NIO實(shí)現(xiàn)群聊系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java NIO實(shí)現(xiàn)群聊系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
java實(shí)現(xiàn)支付寶支付接口的調(diào)用
本文主要介紹了java實(shí)現(xiàn)支付寶支付接口的調(diào)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
200行java代碼實(shí)現(xiàn)2048小游戲
這篇文章主要為大家詳細(xì)介紹了200行java代碼實(shí)現(xiàn)2048小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04
Spring?Cloud?Eureka高可用配置(踩坑記錄)
在進(jìn)行Eureka高可用配置時,控制臺一直出現(xiàn)“......”的錯誤,但是在瀏覽器中輸入地址:peer1:8761 卻是可正常運(yùn)行,這篇文章主要介紹了Spring?Cloud踩坑之Eureka高可用配置,需要的朋友可以參考下2023-08-08
java中常見XML解析器的使用詳解(JAXP,DOM4J,Jsoup,JsoupXPath)
為了處理和操作XML數(shù)據(jù),我們需要使用XML解析器,本文將介紹幾種常用的XML解析器,包括JAXP、DOM4J、Jsoup和JsoupXPath,需要的小伙伴可以參考一下2023-11-11

