文件解压缩ZIP工具类

public class ZipUtil {

   private static final int BUFFER_SIZE = 2 * 1024;

   /**
     * @param srcDir 压缩文件夹路径
    * @param outDir 压缩文件输出流
    * @param KeepDirStructure 是否保留原来的目录结构,
    *           true:保留目录结构;
    *       false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
    * @throws RuntimeException 压缩失败会抛出运行时异常
    */
   public static void toZip(String[] srcDir, String outDir,
         boolean KeepDirStructure) throws RuntimeException, Exception {

      OutputStream out = new FileOutputStream(new File(outDir));

      long start = System.currentTimeMillis();
      ZipOutputStream zos = null;
      try {
         zos = new ZipOutputStream(out);
         List<File> sourceFileList = new ArrayList<File>();
         for (String dir : srcDir) {
            File sourceFile = new File(dir);
            sourceFileList.add(sourceFile);
         }
         compress(sourceFileList, zos, KeepDirStructure);
         long end = System.currentTimeMillis();
         System.out.println("压缩完成,耗时:" + (end - start) + " ms");
      } catch (Exception e) {
         throw new RuntimeException("zip error from ZipUtils", e);
      } finally {
         if (zos != null) {
            try {
               zos.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
      }

   }

   /**
    * 递归压缩方法
    * @param sourceFile 源文件
    * @param zos zip输出流
    * @param name 压缩后的名称
    * @param KeepDirStructure 是否保留原来的目录结构,
    *           true:保留目录结构;
    *       false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
    * @throws Exception
    */
   private static void compress(File sourceFile, ZipOutputStream zos,
         String name, boolean KeepDirStructure) throws Exception {
      byte[] buf = new byte[BUFFER_SIZE];
      if (sourceFile.isFile()) {
         zos.putNextEntry(new ZipEntry(name));
         int len;
         FileInputStream in = new FileInputStream(sourceFile);
         while ((len = in.read(buf)) != -1) {
            zos.write(buf, 0, len);
         }
         // Complete the entry
         zos.closeEntry();
         in.close();
      } else {
         File[] listFiles = sourceFile.listFiles();
         if (listFiles == null || listFiles.length == 0) {
            if (KeepDirStructure) {
               zos.putNextEntry(new ZipEntry(name + "/"));
               zos.closeEntry();
            }

         } else {
            for (File file : listFiles) {
               if (KeepDirStructure) {
                  compress(file, zos, name + "/" + file.getName(),
                        KeepDirStructure);
               } else {
                  compress(file, zos, file.getName(), KeepDirStructure);
               }

            }
         }
      }
   }

   private static void compress(List<File> sourceFileList,
         ZipOutputStream zos, boolean KeepDirStructure) throws Exception {
      byte[] buf = new byte[BUFFER_SIZE];
      for (File sourceFile : sourceFileList) {
         String name = sourceFile.getName();
         if (sourceFile.isFile()) {
            zos.putNextEntry(new ZipEntry(name));
            int len;
            FileInputStream in = new FileInputStream(sourceFile);
            while ((len = in.read(buf)) != -1) {
               zos.write(buf, 0, len);
            }
            zos.closeEntry();
            in.close();
         } else {
            File[] listFiles = sourceFile.listFiles();
            if (listFiles == null || listFiles.length == 0) {
               if (KeepDirStructure) {
                  zos.putNextEntry(new ZipEntry(name + "/"));
                  zos.closeEntry();
               }

            } else {
               for (File file : listFiles) {
                  if (KeepDirStructure) {
                     compress(file, zos, name + "/" + file.getName(),
                           KeepDirStructure);
                  } else {
                     compress(file, zos, file.getName(),
                           KeepDirStructure);
                  }

               }
            }
         }
      }
   }
   /**
    * 解压缩zip文件到指定目录
    * @param zipFilePath 待解压缩的zip文件路径
    * @param destDirPath 目标目录路径
    * @throws IOException
    */
   public static void unzip(String zipFilePath, String destDirPath) throws IOException {
      File destDir = new File(destDirPath);
      if (!destDir.exists()) {
         destDir.mkdir();
      }
      ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath));
      ZipEntry entry = null;
      while ((entry = zis.getNextEntry()) != null) {
         String entryName = entry.getName();
         String filePath = destDirPath + File.separator + entryName;
         if (entry.isDirectory()) {
            File dir = new File(filePath);
            if (!dir.exists()) {
               dir.mkdirs();
            }
         } else {
            File file = new File(filePath);
            File parent = file.getParentFile();
            if (!parent.exists()) {
               parent.mkdirs();
            }
            FileOutputStream fos = new FileOutputStream(file);
            byte[] buf = new byte[BUFFER_SIZE];
            int len = 0;
            while ((len = zis.read(buf)) != -1) {
               fos.write(buf, 0, len);
            }
            fos.close();
         }
      }
      zis.close();
   }
}

测试用例:

// 测试压缩文件夹
String[] srcDir = {"E:/test/src1", "E:/test/src2"};
String outDir = "E:/test/dest.zip";
boolean KeepDirStructure = true;
try {
    ZipUtil.toZip(srcDir, outDir, KeepDirStructure);
} catch (Exception e) {
    e.printStackTrace();
}
// 测试解压缩文件
String zipFilePath = "E:/test/dest.zip";
String destDirPath = "E:/test/dest";
try {
    File destDir = new File(destDirPath);
    if (!destDir.exists()) {
        destDir.mkdir();
    }
    ZipUtil.unzip(zipFilePath, destDirPath);
} catch (Exception e) {
    e.printStackTrace();
}
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值