Java文件压缩工具类ZipUtils学习笔记
最近工作中用到了文件的压缩,经过在网上查询和自己的摸索总结如下工具了,支持文件压缩,嵌套文件压缩;
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学习笔记相关推荐
- Java 文件压缩工具类(支持多级目录压缩)
一.特点 提供了多个重载方法,适用于多种场景 支持压缩完成后返回输入流,方便文件下载时进行流对拷 支持对输入流进行压缩 支持对多级目录压缩 二.源码 /*** 文件压缩工具类** @author zh ...
- Java 文件压缩工具类
import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.io.*; import java.util.zip.ZipEn ...
- java aviator使用类_Aviator学习笔记
一.简单认识Aviator: Aviator是一个高性能.轻量级的 java 语言实现的表达式求值引擎,它动态地将表达式编译成字节码并运行,主要用于各种表达式的动态求值. Aviator的优点: Av ...
- Java程序猿的JavaScript学习笔记(汇总文件夹)
最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...
- Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java开发面试高频考点学习笔记(每日更新)
Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝 2.接口和抽象类的区别 3.java的内存是怎么分配的 4.java中的泛型是什么?类型擦除是什么? 5.Java中的反射是什么 6. ...
- 杨晓峰-java核心技术36讲(学习笔记)- 第1讲 | 谈谈你对Java平台的理解?
杨晓峰-java核心技术36讲(学习笔记) 接下来我会分享杨晓峰-java核心技术36讲的学习笔记,内容较多,补充了其中一些牛人评论,相对详细(仅供个人学习记录整理,希望大家支持正版:https:// ...
- Java虚拟机(JVM)学习笔记(不定时更新)
Java虚拟机(JVM)学习笔记 不少组织都曾开发过Java虚拟机: SUN公司曾经使用过3个虚拟机,Classic.Exact VM.Hotspot. 其中Hotspot虚拟机沿用至今,并已 ...
- 拉勾网《32个Java面试必考点》学习笔记之十一------消息队列与数据库
本文为拉勾网<32个Java面试必考点>学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频<32个Java面试必考点>.若本文侵犯了相关所有者的权益,请联系:txz ...
最新文章
- 一个好玩的 屏蔽别人审查元素F12 右键及其他复制粘贴等
- Little Sub and Triangles
- (转) 各种好用的插件 Xcode
- WWDC19 苹果宣布全新 UI 框架 SwiftUI
- 软件测试用mac还是windows,Boot Camp还是虚拟机?Mac+Win实测
- 【Cocoa(mac) Application 开发系列之二】总结一些常用控件及自定义View
- JavaScript 编码指南
- linux 内网共享文件夹_linux局域网文件共享服务器
- 【DeepLearning】深入理解dropout正则化
- 百词斩平板Android,百词斩ipad电脑版
- 指数增长模型matlab代码_多元思维模型1:复利模型——拥抱指数增长
- 【渝粤题库】陕西师范大学200531 英语测试 作业(高起本、专升本)
- 怎么正确使用代理IP
- 6种不同画法画平行线_平行线的画法
- dmz和端口映射_使用DMZ主机功能代替FTP服务端口映射无法使用的问题
- 零基础学习Vue3(保姆级教学)
- python看图猜成语_看图猜成语200个图答案 看图猜成语图片答案大全
- 数据库实验六 触发器实验
- 2022-2028全球半导体CMP过滤器市场专题研究及投资评估报告
- 广东省计算机等级考试一级试题(1),全国计算机等级考试一级B模拟试题及答案(1)...