Java实现将文件或者文件夹压缩成zip

Java实现将文件或者文件夹压缩成zip

        最近碰到个需要下载zip压缩包的需求,于是我在网上找了下别人写好的zip工具类。但找了好多篇博客,总是发现有bug。因此就自己来写了个工具类。

        这个工具类的功能为:

      • (1)可以压缩文件,也可以压缩文件夹
      • (2)同时支持压缩多级文件夹,工具内部做了递归处理
      • (3)碰到空的文件夹,也可以压缩
      • (4)可以选择是否保留原来的目录结构,如果不保留,所有文件跑压缩包根目录去了,且空文件夹直接舍弃。注意:如果不保留文件原来目录结构,在碰到文件名相同的文件时,会压缩失败。
      • (5)代码中提供了2个压缩文件的方法,一个的输入参数为文件夹路径,一个为文件列表,可根据实际需求选择方法。

      

        下面直接上代码

package com.ibm.scm.purchase.utils;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;
import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;
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{long start = System.currentTimeMillis();ZipOutputStream zos = null ;try {zos = new ZipOutputStream(out);File sourceFile = new File(srcDir);compress(sourceFile,zos,sourceFile.getName(),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();}}}}/*** 压缩成ZIP 方法2* @param srcFiles 需要压缩的文件列表* @param out           压缩文件输出流* @throws RuntimeException 压缩失败会抛出运行时异常*/public static void toZip(List<File> srcFiles , OutputStream out)throws RuntimeException {long start = System.currentTimeMillis();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();}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()){// 向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);}}}}}public static void main(String[] args) throws Exception {/** 测试压缩方法1  */FileOutputStream fos1 = new FileOutputStream(new File("c:/mytest01.zip"));ZipUtils.toZip("D:/log", fos1,true);/** 测试压缩方法2  */List<File> fileList = new ArrayList<File>();fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/jar.exe"));fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/java.exe"));FileOutputStream fos2 = new FileOutputStream(new File("c:/mytest02.zip"));ZipUtils.toZip(fileList, fos2);}}

二、注意事项

    写该工具类时,有些注意事项说一下:

        (1)支持选择是否保留原来的文件目录结构,如果不保留,那么空文件夹直接不用处理。

        (1)碰到空文件夹时,如果需要保留目录结构,则直接添加个ZipEntry就可以了,不过就是这个entry的名字后面需要带上一斜杠(/)表示这个是目录。

        (2)递归时,不需要把zip输出流关闭,zip输出流的关闭应该是在调用完递归方法后面关闭

        (3)递归时,如果是个文件夹且需要保留目录结构,那么在调用方法压缩他的子文件时,需要把文件夹的名字加一斜杠给添加到子文件名字前面,这样压缩后才有多级目录。

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

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

相关文章

算法题+JVM+自定义View,隔壁都馋哭了

反思 昨晚去北京大望路阿里面试, 产生了严重的挫败感, 羞愧难当. 比不得从大学就有目标有理想, 一直在为目标努力学习技术的同学, 在大学唯一能拿得出手的就是参加了电子设计大赛, 学了点嵌入式的知识. 毕业后开始做android, 说得好听点叫做项目, 实际上就是搬代码, 真正记到…

n2n内网穿透打洞部署全过程 + nginx公网端口映射

内网穿透、打洞工具有很多&#xff0c;此前在windows上使用的是vidcc这个玩意&#xff0c;也正因为linux不支持。自此在linux尝试过一些打洞工具&#xff0c;ssh 反向代理这些&#xff0c;因为安全性不便捷等多种原因&#xff0c;最终选择了n2n。 由于初次接触n2n&#xff0c;对…

Windows下快速删除上万个文件和子目录

为什么会慢 如果直接在Windows文件管理器里删除的话&#xff08;通过菜单或者键盘Del或者ShiftDel&#xff09;&#xff0c;删除这个数量的文件需要大概10几分钟&#xff0c;具体根据文件数量目录层次不同耗时不同。这么慢是因为在删除之前系统有个准备阶段&#xff0c;在这个阶…

终于有人把安卓程序员必学知识点全整理出来了,BAT大厂面试总结

行业激烈变化时&#xff0c;恰恰是机会最多的时候 坦白讲&#xff0c;许多人骨子里害怕变化和竞争。 其实大可不必。 一来&#xff0c;怕也没用嘛。二来&#xff0c;变化越快&#xff0c;组合要素增加了&#xff0c;意味着新的工作机会越多。 就像传统媒体VS新媒体。 放在…

c#反混淆工具de4dot 一般混淆都可以解决

c#反混淆工具de4dot 一般混淆都可以解决 使用方法&#xff1a; 1、CMD 打开 De4Dot 所在文件夹 最好是以管理员身份运行CMD 2、输入 De4Dot C:\Users\muzigaiyu\Desktop\demo.exe 回车 成功后会在软件所在文件夹生成 demo-cleaned.exe 在用dotpeek 或者其他软件打开exe即可看…

餐厅点餐系统:测试与部署

项目测试与部署 1.系统测试 项目调试完成后&#xff0c;将项目打包成war包放入tomcat/wabapps文件夹&#xff0c;本机启动tomcat&#xff0c;redis缓存&#xff0c;mysql数据库等服务&#xff0c;本机访问localhost&#xff1a;8080/BookFood&#xff0c;测试系统的各个功能是否…

SpringCloud与Seata分布式事务初体验

在本篇文章中我们在SpringCloud环境下通过使用Seata来模拟用户购买商品时由于用户余额不足导致本次订单提交失败&#xff0c;来验证下在MySQL数据库内事务是否会回滚。 本章文章只涉及所需要测试的服务列表以及Seata配置部分。 用户提交订单购买商品大致分为以下几个步骤&…

想学IT的必看!今年Android面试必问的这些技术面,架构师必备技能

第一次观看我文章的朋友&#xff0c;可以关注、点赞、转发一下&#xff0c;每天分享各种干货技术和程序猿趣事 前言 职场的金三银四跳槽季又来了&#xff0c;不同的是今年比往年「冷」一些&#xff0c;形式更加严峻一些&#xff0c;大家多多少少可能都听到或看到一些信息&…

springboot集成redis使用redis作为session报错ClassNotFoundException类RememberMeServices

springboot 集成redis使用redis作为缓存&#xff0c;会报错的问题。 错误信息&#xff1a; java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration.taskSchedulerat org.springframew…

阿里巴巴分布式事务利器Seata环境准备

阿里巴巴自从跟SpringCloud共同发起创建微服务开源社区时&#xff0c;开启了SpringCloud Alibaba分支&#xff0c;而且在生态内提供了一款适用于分布式应用程序&#xff08;Dubbo、SpringCloud等&#xff09;的事务框架Seata&#xff0c;该框架经过多个大版本的发布&#xff0c…

对于‘敲什么都队’自主开发的《校园服务》软件的使用体验

信1805-1 边信哲 20183694 在六月十三日我系组织的2017级软件工程交流大会中&#xff0c;我为第十一组敲什么都队’自主开发的《校园服务》软件投出了我的一票&#xff0c;在为数众多的校园服务类软件中&#xff0c;《校园服务》最吸引我的地方就是他们的软件能完成数据…

阿里P7大牛亲自教你!BAT这种大厂履历意味着什么?积累总结

金九银十过后各大网络平台都是各种面经分享&#xff0c;包括已收offer&#xff0c;或面试失败的都有&#xff0c;相信大部分人都拿到了自己心仪的大厂offer&#xff0c;不过也有没有少数没能进到自己内心向往的大厂而懊恼的&#xff0c;那么到底如何才能进大厂&#xff0c;该准…

启动mac版docker自带的k8s

最近准备好好学习下k8s&#xff0c;为了图方便&#xff0c;直接使用docker集成的k8s&#xff0c;但是网上找了一些教程但都没能一次性成功&#xff0c;只好自己从头跑一遍&#xff0c;顺手写个教程可以方便有类似需求的同学参考。 话不多说&#xff0c;直接上步骤。 1.下载doc…

yum安装mysql

在CentOS7中默认安装有MariaDB&#xff0c;这个是MySQL的分支&#xff0c;但为了需要&#xff0c;还是要在系统中安装MySQL&#xff0c;而且安装完成之后可以直接覆盖掉MariaDB。 1. 下载并安装MySQL官方的 Yum Repository 1[rootBrianZhu /]# wget -i -c http://dev.mysql.com…

springboot很多以来jar包是在外部当时候,如何打dockerfile到阿里云

首先保证springboot与各种jar包文件夹在同一目录 dockerfile如下内容 FROM frolvlad/alpine-oraclejdk8 VOLUME /usr/cloud ADD lib /lib/ ADD lib_attachment /lib_attachment/ ADD lib_bigdata /lib_bigdata/ ADD lib_bpm /lib_bpm/ ADD lib_deploy /lib_deploy/ ADD lib_el…

阿里P7大牛手把手教你!一眼就能看懂的Android自学手册,真香!

前言 曾听过很多人说Android学习很简单&#xff0c;做个App就上手了&#xff0c;工作机会多&#xff0c;毕业后也比较容易找工作。这种观点可能是很多Android开发者最开始入行的原因之一。 在工作初期&#xff0c;工作主要是按照业务需求实现App页面的功能&#xff0c;按照设…

【VScode】使用VScode 来写markdown时序图

准备工作在VScode中下载插件Markdown Preview Enhanced插件创建一个.md文件在VScode中打开文件&#xff0c;界面内点击右键可以看到Open preview to the side(还有很多方法外面都能搜到)&#xff0c;可以进行实时预览效果开始markdown第一行主标题&#xff08;次标题依次加#&am…

阿里P7大牛整理!BAT大厂面试基础题集合,成功入职字节跳动

都说大厂面试必问源码&#xff0c;可很多人看完MMKV 源码、Handler 源码、Binder 源码、OkHttp 源码等源码记不住&#xff0c;是脑子有问题吗&#xff1f;当然不是&#xff01;是因为你没有掌握学习源码的技巧。 我的朋友子路&#xff0c;很多人都叫他路神&#xff0c;称他为“…

大项目之网上书城(八)——数据库大改添加图书

目录 大项目之网上书城&#xff08;八&#xff09;——数据库大改&添加图书主要改动1.数据库新增表代码2.数据库新增触发器3.其他对BookService和BookDao的修改代码4.addBook.jsp代码效果图5.AddNewBookServlet代码大项目之网上书城&#xff08;八&#xff09;——数据库大…

hping3工具DOS攻击实验

需要两台机器&#xff0c;一台扮演攻击源&#xff0c;另一做目标源。 攻击源地址:10.0.40.4 被攻击机器地址:10.0.40.246 2 被攻击的机器上安装tcpdump&#xff0c;tcpdump主要是用来抓包的&#xff0c;看看网络数据包是否到达。 $ yum install tcpdump -y 3 首先开启tcp…