java实现文件压缩与解压缩通用方法

    技术2024-10-09  58

    java实现文件压缩与解压缩通用方法

    压缩与解压缩有时候会用到,特地记录压缩与解压的通用方法,方便日后使用。

    一:导包
    <!--文件压缩与解压--> <dependency> <groupId>net.lingala</groupId> <artifactId>zip4j</artifactId> <version>1.3.3</version> </dependency>

    这里可以吧lang3的工具包导入,会使用。

    二:写个类实现压缩与解压:
    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 org.apache.commons.lang3.StringUtils; import java.io.File; public class CompressUtil { public static final String COMPRESS_TYPE = ".zip"; /**===========================压缩==================================**/ /** * @param src 要压缩的指定文件 * @return */ public static String zip(String src) { return zip(src, null); } /** * @param src 要压缩的指定文件 * @param password 压缩指定的文件 * @return */ private static String zip(String src, String password) { return zip(src, null, password); } /** * @param src 要压缩的指定文件 * @param dest 压缩文件存放路径 * @param password 压缩指定的文件 * @return */ private static String zip(String src, String dest, String password) { return zip(src, dest, true, password); } /** * @param src 要压缩的指定文件 * @param dest 压缩文件存放路径 * @param isCreateDir 是否在压缩文件里创建目录,仅在压缩文件为目录时有效。若为false,则直接压缩目录下文件到压缩文件 * @param password 压缩指定的文件 * @return */ private static String zip(String src, String dest, boolean isCreateDir, String password) { File srcFile = new File(src); dest = createDestinationPath(srcFile, dest); ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); if (password != null && !"".equals(password)) { parameters.setEncryptFiles(true); parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); parameters.setPassword(password.toCharArray()); } try { ZipFile zipFile = new ZipFile(dest); if (srcFile.isDirectory()) { //如果不创建目录,将直接把给定目录下的文件压缩到文件夹,即没有目录结构 if (!isCreateDir) { File[] subFiles = srcFile.listFiles(); int num = 0; if (subFiles != null) { num = subFiles.length; for (int i = 0; i < num; i++) { if (subFiles[i].isDirectory()) { zip(subFiles[i].getAbsolutePath(), dest, isCreateDir, password); } else { zipFile.addFile(subFiles[i], parameters); } } return dest; } zipFile.addFolder(srcFile, parameters); } } else { zipFile.addFile(srcFile, parameters); } return dest; } catch (Exception e) { e.printStackTrace(); } return null; } private static String createDestinationPath(File srcFile, String dest) { if (dest == null || "".equals(dest)) { if (srcFile.isDirectory()) { dest = srcFile.getParent() + File.separator + srcFile.getName() + COMPRESS_TYPE; } else { String fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf(".")); dest = srcFile.getParent() + File.separator + fileName + COMPRESS_TYPE; } } else { createDestinationPath(dest); if (dest.endsWith(File.separator)) { String fileName = ""; if (srcFile.isDirectory()) { fileName = srcFile.getName(); } else { fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf(".")); } dest += fileName + COMPRESS_TYPE; } } return dest; } private static boolean createDestinationPath(String dest) { File destDir = null; if (dest.endsWith(File.separator)) { destDir = new File(dest); } else { destDir = new File(dest.substring(0, dest.lastIndexOf(File.separator))); } if (!destDir.exists()) { return destDir.mkdirs(); } return false; } /**=======================解压===========================**/ /** * 未指定解压文件夹的就解压到文件目录 * * @param unZipBeforeFile 压缩文件 */ public static void unZip(String unZipBeforeFile) { File src = new File(unZipBeforeFile); String destName = src.getParent() + File.separator; unZip(unZipBeforeFile, destName); } /** * @param unZipBeforeFile 解压前的文件 * @param destName 解压后的文件夹 */ private static void unZip(String unZipBeforeFile, String destName) { unZip(unZipBeforeFile, destName, null); } /** * @param unZipBeforeFile 解压前的zip * @param destName 解压后的文件夹 * @param password 解压密码 */ private static void unZip(String unZipBeforeFile, String destName, String password) { try { File file = new File(unZipBeforeFile); ZipFile zipFile = new ZipFile(file); zipFile.setFileNameCharset("UTF-8"); if (!zipFile.isValidZipFile()) { throw new ZipException("压缩文件不合法,可能损坏"); } File f = new File(destName); if (f.isDirectory() && !f.exists()) { f.mkdir(); } if (zipFile.isEncrypted() && StringUtils.isBlank(password)) { zipFile.setPassword(password.toCharArray()); } zipFile.extractAll(destName); } catch (ZipException e) { e.printStackTrace(); } } public static void main(String[] args) { //压缩 //zip("E:\\0305新项目\\Redis.ppt"); //解压 unZip("E:\\0305新项目\\123\\Redis.zip"); } }

    东西不难,只是临时用的时候找不到的话就只能去网上找,往往网上又是之言片语或者千奇百怪,自己记录通用方法方便自己。积小流成江海,积跬步至千里。

    Processed: 0.010, SQL: 9