两种实现方式

  • java.util.zip.ZipOutputStream
  • org.apache.tools.ant

注意

最初采用java.util.zip.ZipOutputStream的方式,
jdk为1.8,出现BUG:
一定情况下,会将空文件夹变成文件格式,如:
空目录:鉴定人资格 鉴定人资格证书 鉴定人资格证身份证 文件夹都变成文件了
空目录:鉴定资格证书 鉴定人资格证书啊 都是没问题的
最终改为使用:org.apache.ant 依赖包,得以解决

org.apache.ant 方式

         <dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.10.8</version></dependency>
public class ZipApacheUtil {private File zipFile;/*** 压缩文件构造函数* @param finalFile 最终压缩生成的压缩文件:目录+压缩文件名.zip*/public ZipApacheUtil(String finalFile) {zipFile = new File(finalFile);}/*** 执行压缩操作* @param srcPathName 需要被压缩的文件/文件夹*/public void compressExe(String srcPathName) {File srcdir = new File(srcPathName);if (!srcdir.exists()){throw new RuntimeException(srcPathName + "不存在!");}Project prj = new Project();Zip zip = new Zip();zip.setProject(prj);zip.setDestFile(zipFile);FileSet fileSet = new FileSet();fileSet.setProject(prj);fileSet.setDir(srcdir);//fileSet.setIncludes("**/*.java"); //包括哪些文件或文件夹 eg:zip.setIncludes("*.java");//fileSet.setExcludes(...); //排除哪些文件或文件夹zip.addFileset(fileSet);zip.execute();}
}

java.util.zip.ZipOutputStream方式

public final class ZIPUtil {private ZIPUtil() {}/*** 压缩成ZIP 方法     * @param srcDir 压缩文件夹路径** @param out              压缩文件输出流* @param keepDirStructure 是否保留原来的目录结构,true:保留目录结构;*                         false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)* @throws RuntimeException 压缩失败会抛出运行时异常*/public static void toZip(String srcDir, OutputStream out, boolean keepDirStructure)throws Exception {ZipOutputStream zos = null;try {zos = new ZipOutputStream(out);File sourceFile = new File(srcDir);compress(sourceFile, zos, sourceFile.getName(), keepDirStructure);} catch (Exception e) {throw new RuntimeException("zip error from ZipUtil", e);} finally {if (zos != null) {zos.close();}if (out != null) {out.close();}}}/*** 递归压缩方法** @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()) {// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字zos.putNextEntry(new ZipEntry(name));// copy文件到zip输出流中int len;FileInputStream in = new FileInputStream(sourceFile);while ((len = in.read(buf)) != -1) {zos.write(buf, 0, len);}// Complete the entryzos.closeEntry();in.close();} else {//是文件夹File[] listFiles = sourceFile.listFiles();if (listFiles == null || listFiles.length == 0) {// 需要保留原来的文件结构时,需要对空文件夹进行处理if (keepDirStructure) {// 空文件夹的处理zos.putNextEntry(new ZipEntry(name + "/"));// 没有文件,不需要文件的copyzos.closeEntry();}} else {for (File file : listFiles) {// 判断是否需要保留原来的文件结构if (keepDirStructure) {// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了compress(file, zos, name + "/" + file.getName(), keepDirStructure);} else {compress(file, zos, file.getName(), keepDirStructure);}}}}}/*** 创建Zip文件** @param fileList    要压缩的文件路径* @param zipFileName ZIP压缩包的路径* @return ZIP压缩包的路径*/public static String createZipFile(List<String> fileList, String zipFileName) throws IOException {if (CollectionUtils.isEmpty(fileList) || StringUtils.isBlank(zipFileName)) {return null;}//构建压缩文件FileFile zipFile = new File(zipFileName);//构建ZIP流对象try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile))) {//循环处理传过来的集合for (int i = 0; i < fileList.size(); i++) {//获取目标文件File inFile = new File(fileList.get(i));if (inFile.exists()) {//定义ZipEntry对象ZipEntry entry = new ZipEntry(inFile.getName());//赋予ZIP流对象属性out.putNextEntry(entry);int len = 0;//缓冲byte[] buffer = new byte[1024];//构建FileInputStream流对象try (FileInputStream fis = new FileInputStream(inFile)) {while ((len = fis.read(buffer)) > 0) {out.write(buffer, 0, len);out.flush();}}//关闭closeEntryout.closeEntry();}}}return zipFileName;}/*** 创建Zip文件** @param contentList 要压缩的文件二进制* @return ZIP压缩包二进制*/public static byte[] createZipByte(List<Map<String, Object>> contentList) throws IOException {String filePath = CommonConstant.TMP_PATH;String zipFileName = "tmp" + DateTools.dateToString(new Date(), DateTools.DF_COMPACT_TIME) + ".zip";//构建压缩文件FileFile zipFile = new File(filePath + "/" + zipFileName);//构建ZIP流对象try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile))) {//循环处理传过来的集合for (Map<String, Object> map : contentList) {String fileName = (String) map.get("fileName");byte[] bytes = (byte[]) map.get("byte");//定义ZipEntry对象ZipEntry entry = new ZipEntry(fileName);//赋予ZIP流对象属性out.putNextEntry(entry);out.write(0);out.flush();//关闭closeEntryout.closeEntry();}}return file2byte(zipFile);}/*** 将文件File转换成byte数组** @param tradeFile* @return*/private static byte[] file2byte(File tradeFile) throws IOException {byte[] buffer = null;try (FileInputStream fis = new FileInputStream(tradeFile);ByteArrayOutputStream bos = new ByteArrayOutputStream()) {byte[] b = new byte[1024];int n;while ((n = fis.read(b)) != -1) {bos.write(b, 0, n);}buffer = bos.toByteArray();}Files.delete(tradeFile.toPath());return buffer;}
}

java压缩文件夹(含有空文件夹)相关推荐

  1. Python 技术篇-用os库实现删除本地文件、非空文件夹方法,python判断本地文件、文件夹是否存在方法

    os.remove() 就是删除文件的 os.removedirs() 就是删除文件夹的 os.path.exists() 用来判断文件或文件夹是否存在 import ospath = "D ...

  2. unity中删除文件夹残留空文件夹问题

    在unity中删除文件夹如果只调用Directory.Delete函数,会发现虽然可以将文件夹下的文件都删除掉,但是还会残留一个空文件夹,因为unity.meata文件没有删除,所以需要将文件夹对应的 ...

  3. Ubuntu删除非空文件夹和空文件夹命令

    非空 :rm -rf Foldername 空 : rmdir Foldername

  4. Java压缩文件和文件夹为zip格式

    工具类ZipUtils 如下: package utils;import java.io.File; import java.io.FileInputStream; import java.io.IO ...

  5. 服务器空文件夹无法删除怎么办,空的文件夹无法删除怎么办 空的文件夹无法删除的原因【图文】...

    电脑已经不是人们生活中所陌生的产品,现在人们的娱乐.办公都会用到电脑,而在电脑被越发使用频繁的当下,出现的问题相对来说就越多了.很多时候这些小问题,却使得人们在使用电脑的过程中碰到大难题.就好比空的文 ...

  6. java压缩文件或文件夹并返回流给前端

    文章目录 一.详细代码 1.Controller层 2.Service层 一.详细代码 1.Controller层 代码如下(示例): @PostMapping("/download&quo ...

  7. jszip压缩图片file-saver批量导出空文件夹以及有损图片问题解决

    1.需求: 所有设备的二维码单个下载很麻烦 需要批量导出 2.问题 2.1使用DataURl格式生成zip 按照jszipAPI 官方示例 使用 DataURl导出的是空文件夹 How to writ ...

  8. java ftp遍历所有子文件_Java 遍历指定文件夹及子文件夹下的文件

    Java 遍历指定文件夹及子文件夹下的文件 /** * 遍历指定文件夹及子文件夹下的文件 * * @author testcs_dn * @date2014年12月12日下午2:33:49 * @pa ...

  9. java 获取子文件夹_JAVA之File类 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件...

    package ioTest.io3; import java.io.File; /* * 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件 . * 并将文件夹和文件名称打印在控制台上面.并且要 ...

最新文章

  1. c# ThreadPool 判断子线程全部执行完毕的四种方法
  2. 天天Linux-安装samba,nasm
  3. [Bash] Search for Text with `grep`
  4. 交换器无法根据自身类型和路由键找到符合条件队列时,有哪些处理?
  5. 普通一维数组、二维数组、字符串及其指针类型
  6. 强化学习组队学习task01——基础
  7. 二年级机器人伙伴看图写话_期末考试一二年级看图写话22篇,附范文!
  8. Android逆向基础笔记—初识逆向
  9. 内存管理之memblock探寻
  10. 通达信画线文件是在服务器吗,通达信画线工具的使用说明★★★★
  11. yyds,35岁自学编程,入职微软
  12. 现代公司制度的法理学基础 (贾登勋 王勇)
  13. 甲骨文牵手腾讯抢占社交云入口
  14. 六千档最强万金油?华硕无畏Pro15 2022锐龙版笔记本体验
  15. 5G,上天了!卫星和基站擦出了火花?
  16. 怎样有效的检索文献?
  17. matlab推导二体问题,二体问题二体问题.ppt
  18. opencv Fisheye camera model
  19. PHP投简历没人回,投简历后没有回复怎么办?
  20. 数据结构-链表、队列、栈、哈希表

热门文章

  1. linux调试-v-n区别,为你分享一些超好用的Unix/Linux 命令技巧
  2. php mktime 时间不对_PHP 语言需要避免的 10 大误区
  3. 计算机应用基础是文管二级吗,计算机应用基础(文管二级)习题册.doc
  4. win10如何安装域名系统服务器地址,win10搭建dns解析服务器地址
  5. 关于球谐函数一些初步的理解
  6. Rsync+Inotify操作文档
  7. CYQ.Data.Orm.DBFast 新增类介绍(含类的源码及新版本配置工具源码)
  8. JQuery:JQuery遍历详解
  9. 阮一峰:炫耀从来不是我的动机,好奇才是
  10. DirectAccess部署(四)之双网卡环境 客户端连接测试(多图!)