package com.iailab.common.utils; import java.io.*; import java.nio.charset.Charset; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; /** * @author PanZhibao * @Description * @createTime 2023年05月25日 15:28:00 */ public class UnzipUtils { /** * 解压zip压缩文件到指定目录 * * @param zipPath zip压缩文件绝对路径 * @param descDir 指定的解压目录 */ public static void unzipFile(String zipPath, String descDir) throws IOException { try { File zipFile = new File(zipPath); if (!zipFile.exists()) { throw new IOException("要解压的压缩文件不存在"); } File pathFile = new File(descDir); if (!pathFile.exists()) { pathFile.mkdirs(); } unzipWithStream(zipPath, descDir); } catch (Exception e) { throw new IOException(e); } } /** * 解压 * * @param zipPath * @param descDir */ public static void unzipWithStream(String zipPath, String descDir) { try (ZipFile zipFile = new ZipFile(zipPath, Charset.forName("GBK"))) { Enumeration e = zipFile.entries(); while (e.hasMoreElements()) { ZipEntry zipEntry = (ZipEntry)e.nextElement(); String zipEntryNameStr = zipEntry.getName(); String zipEntryName = zipEntryNameStr; /*if (zipEntryNameStr.contains("/")) { String str1 = zipEntryNameStr.substring(0, zipEntryNameStr.indexOf("/")); zipEntryName = zipEntryNameStr.substring(str1.length() + 1); }*/ String outPath = (descDir + zipEntryName).replace("\\\\", "/"); File outFile = new File(outPath.substring(0, outPath.lastIndexOf('/'))); if (!outFile.exists()) { outFile.mkdirs(); } if (new File(outPath).isDirectory()) { continue; } writeFile(outPath, zipFile.getInputStream(zipEntry)); } System.out.println("======解压成功======="); } catch (IOException e) { System.out.println("压缩包处理异常,异常信息{}" + e); } } /** * 将流写到文件中 * * @param filePath * @param zipInputStream */ public static void writeFile(String filePath, InputStream zipInputStream) throws IOException { try (OutputStream outputStream = new FileOutputStream(filePath)) { byte[] bytes = new byte[4096]; int len; while ((len = zipInputStream.read(bytes)) != -1) { outputStream.write(bytes, 0, len); } } catch (IOException ex) { System.out.println("解压文件时,写出到文件出错"); } finally { zipInputStream.close(); } } /** * 测试方法 * * @param args * @throws IOException */ public static void test(String[] args) throws IOException { String zipPath = "D:/test/测试文件.zip"; String descDir = "D:/test/解压/"; unzipFile(zipPath, descDir); } }