java 实现压缩zip的几种方案

需求,将指定目录下的文件及文件夹压缩成一个指定赔案号为名称,以".zip"结尾的压缩包提供客户下载。

package com.gblfy.util;import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;/*** java实现zip压缩文件(同一文件夹下的多个文件夹打成一个zip包)** @author gblfy* @date 2020-07-02*/
public class ZipCompressorUtil {static final int BUFFER = 8192;private File zipFile;public ZipCompressorUtil(String pathName) {zipFile = new File(pathName);}/*** 压缩指定文件或者文件夹* <p>* 压缩文件夹,压缩包中包含自己本身这一级文件夹* 例如:*   压缩后的zip包名: a.zip*   压缩目录: D:\1\*   压缩完成后:a.zip 包中包含1这一级文件夹* </p>** @param pathName 传入一个或者多个文件/文件夹的绝对路径 可变参数*/public void compressContainShell(String... pathName) {ZipOutputStream out = null;try {FileOutputStream fileOutputStream = new FileOutputStream(zipFile);CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());out = new ZipOutputStream(cos);String basedir = "";for (int i = 0; i < pathName.length; i++) {//循环遍历传入的文件或者文件夹的绝对路径的 可变参数compress(new File(pathName[i]), out, basedir);}out.close();} catch (Exception e) {throw new RuntimeException(e);}}/*** 压缩指定文件或者文件夹** @param files*/public void compressContainShell(File[] files) {ZipOutputStream out = null;try {FileOutputStream fileOutputStream = new FileOutputStream(zipFile);CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());out = new ZipOutputStream(cos);String basedir = "";for (int i = 0; i < files.length; i++) {//循环遍历传入的文件或者文件夹的绝对路径的 可变参数compress(files[i], out, basedir);}out.close();} catch (Exception e) {throw new RuntimeException(e);}}/*** /*** 压缩指定文件或者文件夹* <p>*   压缩文件夹,压缩包中包含自己本身这一级文件夹*   例如:*    压缩后的zip包名: a.zip*    压缩目录: D:\1\*    压缩完成后:a.zip 包中不包含1这一级文件夹* </p>** @param srcPathNameOrFileName*/public void compressNotContainShell(String srcPathNameOrFileName) {ZipOutputStream out = null;try {FileOutputStream fileOutputStream = new FileOutputStream(zipFile);CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());out = new ZipOutputStream(cos);String basedir = "";//循环遍历传入的文件或者文件夹的绝对路径的 可变参数File dir = new File(srcPathNameOrFileName);if (!dir.exists()) {System.out.println("压缩目录不存在,请核实!");return;}File[] files = dir.listFiles();for (int i = 0; i < files.length; i++) {compress(new File(String.valueOf(files[i])), out, basedir);}out.close();} catch (Exception e) {throw new RuntimeException(e);}}/*** 判断传参类型:是目录还是文件* <p>*   1.如果是文件,则调用压缩文件方法*   2.如果是目录,则调用压缩目录方法* </p>** @param file* @param out* @param basedir*/private void compress(File file, ZipOutputStream out, String basedir) {if (file.isDirectory()) {System.out.println("压缩:" + basedir + file.getName());//调用压缩目录方法this.compressDirectory(file, out, basedir);} else {System.out.println("压缩:" + basedir + file.getName());//调用压缩文件方法this.compressFile(file, out, basedir);}}/*** 压缩一个目录** @param dir  目录* @param out  zip输出流* @param basedir  基础路径前缀  例如: 第一层 “” 第二层 /*/private void compressDirectory(File dir, ZipOutputStream out, String basedir) {if (!dir.exists()) {System.out.println("压缩目录不存在,请核实!");return;}File[] files = dir.listFiles();for (int i = 0; i < files.length; i++) {/* 递归 */compress(files[i], out, basedir + dir.getName() + "/");}}/***压缩一个文件** @param file  文件* @param out  zip输出流* @param basedir 基础路径前缀  例如: 第一层 “” 第二层 /*/private void compressFile(File file, ZipOutputStream out, String basedir) {if (!file.exists()) {System.out.println("压缩文件不存在,请核实!");return;}try {BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));ZipEntry entry = new ZipEntry(basedir + file.getName());out.putNextEntry(entry);int count;byte data[] = new byte[BUFFER];while ((count = bis.read(data, 0, BUFFER)) != -1) {out.write(data, 0, count);}bis.close();} catch (Exception e) {throw new RuntimeException(e);}}/*** 压缩指定文件或者文件夹* <p>*     压缩文件夹,压缩包中包含自己本身这一级文件夹* 例如:*    压缩后的zip包名: a.zip*    压缩目录: D:\1\*    压缩完成后:a.zip 包中包含1这一级文件夹* </p>** @param srcPathNameOrFileName*/public void compressContainShell(String srcPathNameOrFileName) {File file = new File(srcPathNameOrFileName);if (!file.exists()) {throw new RuntimeException(srcPathNameOrFileName + "不存在!");}try {FileOutputStream fileOutputStream = new FileOutputStream(zipFile);CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());ZipOutputStream out = new ZipOutputStream(cos);String basedir = "";compress(file, out, basedir);out.close();} catch (Exception e) {throw new RuntimeException(e);}}//--------------------------------------------单元测试--------------------------------------------public static void main(String[] args) {ZipCompressorUtil zc = new ZipCompressorUtil("D:/resource.zip");String b = "D:\\1\\";// // String b = "D:\\1.jpg";zc.compressNotContainShell(b);// zc.compress("D:\\1.jpg", "D:\\3.jpeg", "D:\\4.jpg", b);}
}

企业内部线上:补充方案

package com.gblfy.test;import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;/*** java实现zip压缩文件(同一文件夹下的多个文件夹打成一个zip包)** @author gblfy* @date 2020-07-02*/
public class ZipCompressorUtil2 {static final int BUFFER = 8192;/*** 判断传参类型:是目录还是文件* <p>* 1.如果是文件,则调用压缩文件方法* 2.如果是目录,则调用压缩目录方法* </p>** @param file* @param out* @param basedir*/private void compress(File file, ZipOutputStream out, String basedir) {if (file.isDirectory()) {System.out.println("压缩:" + basedir + file.getName());//调用压缩目录方法this.compressDirectory(file, out, basedir);} else {System.out.println("压缩:" + basedir + file.getName());//调用压缩文件方法this.compressFile(file, out, basedir);}}/*** 压缩一个目录** @param dir     目录* @param out     zip输出流* @param basedir 基础路径前缀  例如: 第一层 “” 第二层 /*/private void compressDirectory(File dir, ZipOutputStream out, String basedir) {if (!dir.exists()) {System.out.println("压缩目录不存在,请核实!");return;}File[] files = dir.listFiles();for (int i = 0; i < files.length; i++) {/* 递归 */compress(files[i], out, basedir + dir.getName() + "/");}}/*** 压缩一个文件** @param file    文件* @param out     zip输出流* @param basedir 基础路径前缀  例如: 第一层 “” 第二层 /*/private void compressFile(File file, ZipOutputStream out, String basedir) {if (!file.exists()) {System.out.println("压缩文件不存在,请核实!");return;}try {BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));ZipEntry entry = new ZipEntry(basedir + file.getName());out.putNextEntry(entry);int count;byte data[] = new byte[BUFFER];while ((count = bis.read(data, 0, BUFFER)) != -1) {out.write(data, 0, count);}bis.close();} catch (Exception e) {throw new RuntimeException(e);}}/*** /*** 压缩指定文件或者文件夹* <p>* 压缩文件夹,压缩包中包含自己本身这一级文件夹* 例如:* 压缩后的zip包名: a.zip* 压缩目录: D:\1\* 压缩完成后:a.zip 包中不包含1这一级文件夹* </p>** @param srcPathNameOrFileName*/public void compressNotContainShell(String srcPathNameOrFileName, String zipFilePath) {ZipOutputStream out = null;try {File zipFile = getZipName(zipFilePath);FileOutputStream fileOutputStream = new FileOutputStream(zipFile);CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());out = new ZipOutputStream(cos);String basedir = "";//循环遍历传入的文件或者文件夹的绝对路径的 可变参数File dir = new File(srcPathNameOrFileName);if (!dir.exists()) {System.out.println("压缩目录不存在,请核实!");return;}File[] files = dir.listFiles();for (int i = 0; i < files.length; i++) {compress(new File(String.valueOf(files[i])), out, basedir);}out.close();} catch (Exception e) {throw new RuntimeException(e);}}/*** 以* @param pathName* @return*/public File getZipName(String pathName) {return new File(pathName);}//--------------------------------------------单元测试--------------------------------------------public static void main(String[] args) {ZipCompressorUtil2 zc = new ZipCompressorUtil2();String docPath = "D:\\22\\srcImgPath\\理赔报名类单证\\";String zipFileName = "D:\\22\\srcImgPath\\123.zip";zc.compressNotContainShell(docPath, zipFileName);// zc.compress("D:\\1.jpg", "D:\\3.jpeg", "D:\\4.jpg", b);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

序列模型简介——RNN, Bidirectional RNN, LSTM, GRU

既然我们已经有了前馈网络和CNN&#xff0c;为什么我们还需要序列模型呢&#xff1f;这些模型的问题在于&#xff0c;当给定一系列的数据时&#xff0c;它们表现的性能很差。序列数据的一个例子是音频的剪辑&#xff0c;其中包含一系列的人说过的话。另一个例子是英文句子&…

行!人工智能玩大了!程序员:太牛!你怎么看?

人工智能真的玩大了吗&#xff1f;人工智能行业的人才真的“爆发了&#xff1f;”AI程序员究竟怎么样&#xff1f;中国AI前景分析 程序员与远方最新参考&#xff0c;是12月2日出炉的《人工智能技术专利深度分析报告》。中国AI专利&#xff0c;已经位于世界前列&#xff0c;且正…

可应用于实际的14个NLP突破性研究成果(一)

语言理解对计算机来说是一个巨大的挑战。幼儿可以理解的微妙的细微差别仍然会使最强大的机器混淆。尽管深度学习等技术可以检测和复制复杂的语言模式&#xff0c;但机器学习模型仍然缺乏对我们的语言真正含义的基本概念性理解。 但在2018年确实产生了许多具有里程碑意义的研究…

String 常用API

public static void main(String[] args) {/*** String 常用API* 字符串* 1>截取* 2>替换**/String fileSuffix ".jpg";int i fileSuffix.indexOf(".");//截取.之后的内容&#xff0c;包含. indexs0String newStr fileSuffix.substring(i 0);…

小学五年级年级计算机教学计划,小学五年级信息技术教学计划范文

人类社会已进入信息时代,日新月异的信息技术在不断地改变着周围的世界。为了推广计算机信息技术,提高全民族的科学文化素质,发展小学信息技术教育。下面是学习啦小编整理的小学五年级信息技术教学计划范文&#xff0c;希望对大家有所帮助!小学五年级信息技术教学计划范文(一)一…

阿里资深技术专家:优秀的数据库存储引擎应具备哪些能力?

导读 本文作者是阿里巴巴OLTP数据库团队资深技术专家——曲山。作为自研高性能、低成本存储引擎X-Engine的负责人&#xff0c;曲山眼中的优秀关系型数据库存储引擎应该具备哪些能力呢&#xff1f; 正文 数据库内核按层次来分&#xff0c;就是两层&#xff1a;SQL & Stor…

开发函数计算的正确姿势——网页截图服务

前言 首先介绍下在本文出现的几个比较重要的概念&#xff1a; 函数计算&#xff08;Function Compute&#xff09;: 函数计算是一个事件驱动的服务&#xff0c;通过函数计算&#xff0c;用户无需管理服务器等运行情况&#xff0c;只需编写代码并上传。函数计算准备计算资源&am…

java实现删除指定指定目录下面指定某种类型的文件

/*** 删除指定目录下面指定文件类型的文件** param path*/public static void delSpecifyTheTypeFile(String path) {File dir new File(path);// 该文件目录下文件全部放入数组File[] files dir.listFiles();if (files ! null) {for (int i 0; i < files.length; i) {St…

如何关闭计算机的f12功能键,win10如何关闭快捷键?win10关闭F1~F12快捷键的方法

win10如何使用快捷键关闭?在win10系统中我们按下F1~F12原本可以正常使用系统中的功能。而然在笔记本中F1~F12竟然被笔记本中的功能所替代了&#xff0c;例如&#xff1a;打开/关闭 无线网卡&#xff0c;屏幕亮度加减、系统音量大小等&#xff0c;导致我们在使用F1~F12的时候只…

阿里巴巴宣布架构调整;英伟达放大招!重磅发布 ​TensorRT 7 ,支持超千种计算变换;苹果、谷歌和亚马逊罕见结盟……...

戳蓝字“CSDN云计算”关注我们哦&#xff01; 嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

阿里开源分布式事务解决方案 Fescar 全解析

广为人知的阿里分布式事务解决方案&#xff1a;GTS&#xff08;Global Transaction Service&#xff09;&#xff0c;已正式推出开源版本&#xff0c;取名为“Fescar”&#xff0c;希望帮助业界解决微服务架构下的分布式事务问题&#xff0c;今天我们一起来深入了解。 FESCAR o…

鲜为人知的混沌工程,到底哪里好?

混沌工程属于一门新兴的技术学科&#xff0c;行业认知和实践积累比较少&#xff0c;大多数IT团队对它的理解还没有上升到一个领域概念。阿里电商域在2010年左右开始尝试故障注入测试的工作&#xff0c;希望解决微服务架构带来的强弱依赖问题。通过本文&#xff0c;你将了解到&a…

计算机软考中集成系统,软考中级系统集成项目管理工程师有哪些作用?

系统集成项目管理工程师属于计算机技术与软件专业技术资格(水平)考试(即软考)中级资格考试里面的一项考试。对于中级工程师而言&#xff0c;通过评定获得职称证书的人比通过考试获得职称证书的人更容易被社会认可与接受。因为评定职称的人有资格、有经验&#xff1b;在当今社会…

Nutanix在中国市场发布多云合作伙伴计划

近日&#xff0c;企业云操作系统厂商Nutanix宣布&#xff0c;在中国市场正式发布“精英技术联盟合作伙伴计划”。 “精英技术联盟合作伙伴计划”面向国内解决方案、应用和软硬件合作伙伴以及开发人员&#xff0c;帮助他们在全球领先的企业云平台上构建和部署差异化的解决方案&a…

将视觉深度学习模型应用于非视觉领域

介绍 近些年来&#xff0c;深度学习技术已经彻底改变了计算机视觉领域。由于迁移学习和各种各样的学习资源的出现&#xff0c;任何人都可以通过使用预训练的模型&#xff0c;将其应用到自己的工作当中&#xff0c;以此获得非常好的结果。随着深度学习越来越商业化&#xff0c;…

字符串随机生成工具类

package com.gblfy.util;import org.springframework.stereotype.Component;import java.util.ArrayList; import java.util.Arrays; import java.util.Random;/*** 字符随机生成类*/ Component public class RandomStrUtil {/*** 随机产生类型枚举*/public static enum TYPE {…

什么是应用宝统一链接服务器,applink

从同构的角度和降级支持的角度来看&#xff0c;使用Android和iOS系统增强的AppLinks和Universal Links&#xff0c;通过HTTPS统一标准打开APP是标准的选择。使用自定义Scheme打开APP适用于&#xff1a;网站尚不支持HTTPS&#xff1b;App的iOS版本尚未添加Universal Links支持&a…

如何在Flutter上优雅地序列化一个对象

序列化一个对象才是正经事 对象的序列化和反序列化是我们日常编码中一个非常基础的需求&#xff0c;尤其是对一个对象的json encode/decode操作。每一个平台都会有相关的库来帮助开发者方便得进行这两个操作&#xff0c;比如Java平台上赫赫有名的GSON&#xff0c;阿里巴巴开源…

腾讯汤道生:2020年加大投入产业互联网生态建设

新一轮产业革命正在不断深化&#xff0c;为全球经济发展提供了历史性机遇。如何通过数字化、智能化等手段打通产业链不同环节&#xff0c;优化产业效率&#xff0c;实现产业协同&#xff0c;加速产业转型升级&#xff1f; “与合作伙伴‘共创’是产业互联网发展最重要的路径&am…

定时器new Timer().schedule()的使用

文章目录一、基础知识1. 简介2. 常用API二、需求案例2.1. 案例12.2. 案例22.3. 案例3三、场景案例3.1. 在特定时间执行任务&#xff0c;只执行一次3.2. 指定第一次执行的时间&#xff0c;然后按照间隔时间&#xff0c;重复执行在开发中&#xff0c;我们经常需要一些周期性的操作…