日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java使用zip4j库 压缩文件工具类(自适应压缩包编码格式)

發布時間:2023/12/20 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java使用zip4j库 压缩文件工具类(自适应压缩包编码格式) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 簡單說明:

1. 基于jdk1.8版本編寫、測試;

2. 使用zip4j1.3.2;

3. 可解決壓縮包解壓后,文件名亂碼;

2. 支持情況:

1. 支持 壓縮、解壓縮操作;

2. 支持 加密、不加密操作;

3. 支持 自適應壓縮包編碼格式;

3. 解決文件名亂碼核心

采用的代碼

private static String getFileNameCharset(String path) throws ZipException {String encoding = "GBK";//默認編碼ZipFile zipFile = new ZipFile(path);List<FileHeader> list = zipFile.getFileHeaders();for (FileHeader fileHeader : list) {if (fileHeader.isFileNameUTF8Encoded()) {encoding = "UTF-8";break;}}return encoding;}

不確定代碼,未采用此方法

private static boolean isMessyCode(String str) {for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);// 當從Unicode編碼向某個字符集轉換時,如果在該字符集中沒有對應的編碼,則得到0x3f(即問號字符?)// 從其他字符集向Unicode編碼轉換時,如果這個二進制數在該字符集中沒有標識任何的字符,則得到的結果是0xfffdif ((int) c == 0xfffd) {// 存在亂碼return true;}}return false;}

5. 具體代碼

import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List;import org.apache.commons.lang3.StringUtils;import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.model.FileHeader; import net.lingala.zip4j.model.ZipParameters; import net.lingala.zip4j.util.Zip4jConstants;/*** @author 楊彭偉* @date 2022-03-03 13:26*/ public class ZipUtil {/*** 使用給定密碼解壓指定的ZIP壓縮文件到指定目錄* <p>* 如果指定目錄不存在,可以自動創建,不合法的路徑將導致異常被拋出** @param zip 指定的ZIP壓縮文件* @param dest 解壓目錄* @param passwd ZIP文件的密碼* @return 解壓后文件數組* @throws ZipException 壓縮文件有損壞或者解壓縮失敗拋出*/public static File[] unzipEncrypt(String zip, String dest, String passwd) throws ZipException {File zipFile = new File(zip);return unzip(zipFile, dest, passwd);}/*** 使用給定密碼解壓指定的ZIP壓縮文件到指定目錄* <p>* 如果指定目錄不存在,可以自動創建,不合法的路徑將導致異常被拋出** @param zip 指定的ZIP壓縮文件* @param dest 解壓目錄* @return 解壓后文件數組* @throws ZipException 壓縮文件有損壞或者解壓縮失敗拋出*/public static File[] unzip(String zip, String dest) throws ZipException {File zipFile = new File(zip);return unzip(zipFile, dest, null);}/*** 使用給定密碼解壓指定的ZIP壓縮文件到當前目錄** @param zip 指定的ZIP壓縮文件* @param passwd ZIP文件的密碼* @return 解壓后文件數組* @throws ZipException 壓縮文件有損壞或者解壓縮失敗拋出*/public static File[] unzipEncrypt(String zip, String passwd) throws ZipException {File zipFile = new File(zip);File parentDir = zipFile.getParentFile();return unzip(zipFile, parentDir.getAbsolutePath(), passwd);}/*** 解壓指定的無密碼ZIP壓縮文件到當前目錄** @param zip 指定的ZIP壓縮文件* @return 解壓后文件數組* @throws ZipException 壓縮文件有損壞或者解壓縮失敗拋出*/public static File[] unzip(String zip) throws ZipException {File zipFile = new File(zip);File parentDir = zipFile.getParentFile();return unzip(zipFile, parentDir.getAbsolutePath(), null);}/*** 使用給定密碼解壓指定的ZIP壓縮文件到指定目錄* <p>* 如果指定目錄不存在,可以自動創建,不合法的路徑將導致異常被拋出** @param zipFile 指定的ZIP壓縮文件* @param dest 解壓目錄* @param passwd ZIP文件的密碼* @return 解壓后文件數組* @throws ZipException 壓縮文件有損壞或者解壓縮失敗拋出*/private static File[] unzip(File zipFile, String dest, String passwd) throws ZipException {ZipFile zFile = new ZipFile(zipFile);zFile.setFileNameCharset(getFileNameCharset(zipFile.getAbsolutePath()));if (!zFile.isValidZipFile()) {throw new ZipException("壓縮文件不合法,可能被損壞.");}File destDir = new File(dest);if (destDir.isDirectory() && !destDir.exists()) {destDir.mkdir();}if (zFile.isEncrypted()) {if (StringUtils.isNotEmpty(passwd)) {zFile.setPassword(passwd.toCharArray());} else {throw new ZipException("加密壓縮文件解壓,密碼不能為空");}}zFile.extractAll(dest);List<FileHeader> headerList = zFile.getFileHeaders();List<File> extractedFileList = new ArrayList<File>();for (FileHeader fileHeader : headerList) {if (!fileHeader.isDirectory()) {extractedFileList.add(new File(destDir, fileHeader.getFileName()));}}File[] extractedFiles = new File[extractedFileList.size()];extractedFileList.toArray(extractedFiles);return extractedFiles;}/*** 壓縮指定文件到當前文件夾** @param src 要壓縮的指定文件* @return 最終的壓縮文件存放的絕對路徑, 如果為null則說明壓縮失敗.*/public static String zip(String src) {return zip(src, null);}/*** 使用給定密碼壓縮指定文件或文件夾到當前目錄** @param src 要壓縮的文件* @param passwd 壓縮使用的密碼* @return 最終的壓縮文件存放的絕對路徑, 如果為null則說明壓縮失敗.*/public static String zip(String src, String passwd) {return zip(src, null, passwd);}/*** 使用給定密碼壓縮指定文件或文件夾到當前目錄** @param src 要壓縮的文件* @param dest 壓縮文件存放路徑* @param passwd 壓縮使用的密碼* @return 最終的壓縮文件存放的絕對路徑, 如果為null則說明壓縮失敗.*/public static String zip(String src, String dest, String passwd) {return zip(src, dest, true, passwd);}/*** 使用給定密碼壓縮指定文件或文件夾到指定位置.* <p>* dest可傳最終壓縮文件存放的絕對路徑,也可以傳存放目錄,也可以傳null或者"".<br />* 如果傳null或者""則將壓縮文件存放在當前目錄,即跟源文件同目錄,壓縮文件名取源文件名,以.zip為后綴;<br />* 如果以路徑分隔符(File.separator)結尾,則視為目錄,壓縮文件名取源文件名,以.zip為后綴,否則視為文件名.** @param src 要壓縮的文件或文件夾路徑* @param dest 壓縮文件存放路徑* @param isCreateDir 是否在壓縮文件里創建目錄,僅在壓縮文件為目錄時有效.<br />* 如果為false,將直接壓縮目錄下文件到壓縮文件.* @param passwd 壓縮使用的密碼* @return 最終的壓縮文件存放的絕對路徑, 如果為null則說明壓縮失敗.*/public static String zip(String src, String dest, boolean isCreateDir, String passwd) {File srcFile = new File(src);dest = buildDestinationZipFilePath(srcFile, dest);ZipParameters parameters = new ZipParameters();parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); // 壓縮方式parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); // 壓縮級別if (!StringUtils.isEmpty(passwd)) {parameters.setEncryptFiles(true);parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); // 加密方式parameters.setPassword(passwd.toCharArray());}try {ZipFile zipFile = new ZipFile(dest);if (srcFile.isDirectory()) {// 如果不創建目錄的話,將直接把給定目錄下的文件壓縮到壓縮文件,即沒有目錄結構if (!isCreateDir) {File[] subFiles = srcFile.listFiles();ArrayList<File> temp = new ArrayList<File>();Collections.addAll(temp, subFiles);zipFile.addFiles(temp, parameters);return dest;}zipFile.addFolder(srcFile, parameters);} else {zipFile.addFile(srcFile, parameters);}return dest;} catch (ZipException e) {e.printStackTrace();}return null;}/*** 根據文件路徑獲取編碼格式(解決解壓文件文件名亂碼問題)** @param path* @return* @throws ZipException*/private static String getFileNameCharset(String path) throws ZipException {String encoding = "GBK";ZipFile zipFile = new ZipFile(path);List<FileHeader> list = zipFile.getFileHeaders();for (FileHeader fileHeader : list) {if (fileHeader.isFileNameUTF8Encoded()) {encoding = "UTF-8";break;}}return encoding;}/*** 構建壓縮文件存放路徑,如果不存在將會創建* 傳入的可能是文件名或者目錄,也可能不傳,此方法用以轉換最終壓縮文件的存放路徑** @param srcFile 源文件* @param destParam 壓縮目標路徑* @return 正確的壓縮文件存放路徑*/private static String buildDestinationZipFilePath(File srcFile, String destParam) {if (StringUtils.isEmpty(destParam)) {if (srcFile.isDirectory()) {destParam = srcFile.getParent() + File.separator + srcFile.getName() + ".zip";} else {String fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));destParam = srcFile.getParent() + File.separator + fileName + ".zip";}} else {// 在指定路徑不存在的情況下將其創建出來createDestDirectoryIfNecessary(destParam);if (destParam.endsWith(File.separator)) {String fileName = "";if (srcFile.isDirectory()) {fileName = srcFile.getName();} else {fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));}destParam += fileName + ".zip";}}return destParam;}/*** 在必要的情況下創建壓縮文件存放目錄,比如指定的存放路徑并沒有被創建** @param destParam 指定的存放路徑,有可能該路徑并沒有被創建*/private static void createDestDirectoryIfNecessary(String destParam) {File destDir = null;if (destParam.endsWith(File.separator)) {destDir = new File(destParam);} else {destDir = new File(destParam.substring(0, destParam.lastIndexOf(File.separator)));}if (!destDir.exists()) {destDir.mkdirs();}}public static void main(String[] args) throws ZipException {zip("d:\\test\\cc", "d:\\test\\cc.zip", "11");unzipEncrypt("d:\\test\\cc.zip", "d:\\test\\unzip", "11");} }

6. 參考文章

1. https://www.cnblogs.com/manhuidhu/p/8027499.html 2. https://blog.csdn.net/qq_34122822/article/details/90902815

總結

以上是生活随笔為你收集整理的Java使用zip4j库 压缩文件工具类(自适应压缩包编码格式)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。