您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)利用Java怎么多個文件進(jìn)行壓縮加密并重命名,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
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(); //獲取最后一個點的位置 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";//加密密碼 //請在單元測試進(jìn)行測試, 或者將方法改為 static 方法 //String result = zipFilesAndEncrypt(filePath, fileRename, password); //System.out.println(result); } }
效果如下:
關(guān)于利用Java怎么多個文件進(jìn)行壓縮加密并重命名就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。