最近工作中用到了文件的压缩,经过在网上查询和自己的摸索总结如下工具了,支持文件压缩,嵌套文件压缩;

package utils;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;import org.apache.commons.lang3.time.StopWatch;import ggframework.bottom.log.GGLogger;
/*** * 文件压缩工具类* * @version 1.0* @since JDK1.7* @author yaomy* @date 2018年8月8日 上午10:20:52*/
public class ZipUtils {private static final int  BUFFER_SIZE = 2 * 1024;/*** 压缩成ZIP 方法1* @param srcDir 压缩文件夹路径 * @param out    压缩文件输出流* @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构; *                          false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)* @throws RuntimeException 压缩失败会抛出运行时异常*/public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure)throws RuntimeException{StopWatch watch = new StopWatch();watch.start();ZipOutputStream zos = null ;try {zos = new ZipOutputStream(out);File sourceFile = new File(srcDir);compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);watch.stop();GGLogger.info("压缩完成,耗时:" + watch.getTime() +" ms");} catch (Exception e) {throw new RuntimeException("zip error from ZipUtils",e);}finally{if(zos != null){try {zos.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 压缩成ZIP 方法2* @param srcFiles 需要压缩的文件列表* @param out           压缩文件输出流* @throws RuntimeException 压缩失败会抛出运行时异常*/public static void toZip(List<File> srcFiles , OutputStream out)throws RuntimeException {StopWatch watch = new StopWatch();watch.start();ZipOutputStream zos = null ;try {zos = new ZipOutputStream(out);for (File srcFile : srcFiles) {byte[] buf = new byte[BUFFER_SIZE];zos.putNextEntry(new ZipEntry(srcFile.getName()));int len;FileInputStream in = new FileInputStream(srcFile);while ((len = in.read(buf)) != -1){zos.write(buf, 0, len);}zos.closeEntry();in.close();}watch.stop();GGLogger.info("压缩完成,耗时:" + watch.getTime() +" 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()){// 向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);}}}}}
}

Java文件压缩工具类ZipUtils学习笔记相关推荐

  1. Java 文件压缩工具类(支持多级目录压缩)

    一.特点 提供了多个重载方法,适用于多种场景 支持压缩完成后返回输入流,方便文件下载时进行流对拷 支持对输入流进行压缩 支持对多级目录压缩 二.源码 /*** 文件压缩工具类** @author zh ...

  2. Java 文件压缩工具类

    import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.io.*; import java.util.zip.ZipEn ...

  3. java aviator使用类_Aviator学习笔记

    一.简单认识Aviator: Aviator是一个高性能.轻量级的 java 语言实现的表达式求值引擎,它动态地将表达式编译成字节码并运行,主要用于各种表达式的动态求值. Aviator的优点: Av ...

  4. Java程序猿的JavaScript学习笔记(汇总文件夹)

    最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...

  5. Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  6. Java开发面试高频考点学习笔记(每日更新)

    Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝 2.接口和抽象类的区别 3.java的内存是怎么分配的 4.java中的泛型是什么?类型擦除是什么? 5.Java中的反射是什么 6. ...

  7. 杨晓峰-java核心技术36讲(学习笔记)- 第1讲 | 谈谈你对Java平台的理解?

    杨晓峰-java核心技术36讲(学习笔记) 接下来我会分享杨晓峰-java核心技术36讲的学习笔记,内容较多,补充了其中一些牛人评论,相对详细(仅供个人学习记录整理,希望大家支持正版:https:// ...

  8. Java虚拟机(JVM)学习笔记(不定时更新)

    Java虚拟机(JVM)学习笔记 不少组织都曾开发过Java虚拟机: SUN公司曾经使用过3个虚拟机,Classic.Exact VM.Hotspot.     其中Hotspot虚拟机沿用至今,并已 ...

  9. 拉勾网《32个Java面试必考点》学习笔记之十一------消息队列与数据库

    本文为拉勾网<32个Java面试必考点>学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频<32个Java面试必考点>.若本文侵犯了相关所有者的权益,请联系:txz ...

最新文章

  1. 一个好玩的 屏蔽别人审查元素F12 右键及其他复制粘贴等
  2. Little Sub and Triangles
  3. (转) 各种好用的插件 Xcode
  4. WWDC19 苹果宣布全新 UI 框架 SwiftUI
  5. 软件测试用mac还是windows,Boot Camp还是虚拟机?Mac+Win实测
  6. 【Cocoa(mac) Application 开发系列之二】总结一些常用控件及自定义View
  7. JavaScript 编码指南
  8. linux 内网共享文件夹_linux局域网文件共享服务器
  9. 【DeepLearning】深入理解dropout正则化
  10. 百词斩平板Android,百词斩ipad电脑版
  11. 指数增长模型matlab代码_多元思维模型1:复利模型——拥抱指数增长
  12. 【渝粤题库】陕西师范大学200531 英语测试 作业(高起本、专升本)
  13. 怎么正确使用代理IP
  14. 6种不同画法画平行线_平行线的画法
  15. dmz和端口映射_使用DMZ主机功能代替FTP服务端口映射无法使用的问题
  16. 零基础学习Vue3(保姆级教学)
  17. python看图猜成语_看图猜成语200个图答案 看图猜成语图片答案大全
  18. 数据库实验六 触发器实验
  19. 2022-2028全球半导体CMP过滤器市场专题研究及投资评估报告
  20. 广东省计算机等级考试一级试题(1),全国计算机等级考试一级B模拟试题及答案(1)...

热门文章

  1. 卖给高通之后的CSR的现状和未来
  2. 石器时代服务器端支持WIN10,经典石器时代v9.0端(XP.WIN7)架设成功+客户端+架设录像...
  3. git查看函数修改历史
  4. ​当我谈我的自行车时,我谈些什么
  5. 隐写术-PNG文件隐写(一)
  6. rsa public key not find
  7. c语言butter函数,butter函数
  8. 认识植物 - 桫椤(蕨类植物之王植物活化石)
  9. 京东夺宝岛抢拍插件(转)
  10. HDMI EDID详细解析——C代码实现