java创建压缩文件方法(包括文件夹下包含文件夹)

芒果YOLO11改进81:主干Backbone篇之DCNv3结构:即插即用|使用pytorch代码实现,并针对YOLO11专门优化模块 阅读详情

最近需要用到Java的zip文件压缩与解压缩,找了一堆的资料和参考代码,没有一个能够很好的解决问题。要不就是压缩出错,要不就是压缩后的文件目录组织不正确,要不就是中文乱码,总之问题一大堆。没办法只能自己编码搞定。

java里面有个包叫java.util.zip提供zip文件压缩,但是编码的时候非常不方便。编码量太多了,通过搜索,发现apache有个包提供一些简单的方法来实现zip文件的压缩与解压缩http://ant.apache.org/。下载地址:org.apache.tools.zip

如果上面的链接找不到的话也可使用这个链接 http://www.java2s.com/Code/Jar/a/Downloadapacheantzipjar.htm

下载下来解压缩后,该包中的ant.jar里面提供了zip文件压缩与解压缩的功能代码。在项目中引用该类库。

 

要压缩成zip文件,涉及到的问题如下:

1.将要压缩的文件添加到zip文件包中。

2.组织好要压缩的文件目录与压缩后的zip文件目录一致。

3.文件名以及文件夹名中文字符编码。

4.解压缩zip文件,并将解压缩后的文件及文件夹的组织形式要与压缩前的一致。

 

在设计该类的时候,我编写了一下几个方法:

第一个zip方法,将来填入要压缩的文件或文件夹路径,然后压缩成zip文件并保存到指定位置。代码如下:

 1 /**
 2 * 压缩文件或者文件夹压缩采用gb2312编码,其它编码方式可能造成文件名与文件夹名使用中文的情况下压缩后为乱码。。。
 3  *
 4* @param source
 5 *            要压缩的文件或者文件夹
 6 *           建议使用"c:/abc"或者"c:/abc/aaa.txt"这种形式来给定压缩路径
 7  *            使用"c:\\abc"或者"c:\\abc\\aaa.txt"这种形式来给定路径的话,可能导致出现压缩和解压缩路径意外故障。。。
 8  * @param zipFileName
 9 *            压缩后的zip文件名称压缩后的目录组织与windows的zip压缩的目录组织相同。
10  *            会根据压缩的目录的名称,在压缩文件夹中创建一个改名的根目录,其它压缩的文件和文件夹都在该目录下依照原来的文件目录组织形式
11  * @throws IOException
12  *            压缩文件的过程中可能会抛出IO异常,请自行处理该异常。
13  */
14  publicstaticvoid ZIP(String source,String zipFileName)
15         throws IOException {
16     ZipOutputStream zos = new ZipOutputStream(new File(zipFileName));
17  
18     // 设置压缩的时候文件名编码为gb2312
19     zos.setEncoding("gb2312");
20     //System.out.println(zos.getEncoding());
21  
22     File f = new File(source);
23  
24     if (f.isDirectory()) {
25         // 如果直接压缩文件夹
26         ZIPDIR(source, zos,f.getName() + "/");// 此处使用/来表示目录,如果使用\\来表示目录的话,会导致压缩后的文件目录组织形式在解压缩的时候不能正确识别。
27     } else {
28         // 如果直接压缩文件
29         ZIPDIR(f.getPath(), zos, newFile(f.getParent()).getName() + "/");
30         ZIPFile(f.getPath(), zos, newFile(f.getParent()).getName() + "/"
31                 + f.getName());
32     }
33  
34     zos.closeEntry();
35     zos.close();
36 }

为了很好的解决中文编码问题,这里在创建ZipOutputStream输出流的时候就指定其编码为gb2312,这样无论将来是中文的文件名和文件夹,都可以被正确的识别,不会出现乱码的情况。

特别提醒大家注意的是,文件的路径使用的斜杠最好是"/",如果用"\\"来表示路径的话,表面上看这是区分好了文件夹,其实在解压缩的时候zipfile对象就不能很好的识别其为文件夹,有可能将其识别为文件,导致解压出错。这里是个关键点!

第二个ZIPFile方法,专门将指定的文件压缩成为zip文件的方法。代码如下:

 1 /**
 2 * zip 压缩单个文件。除非有特殊需要,否则请调用ZIP方法来压缩文件!
 3  *
 4* @param sourceFileName
 5 *            要压缩的原文件
 6  * @param zipFileName
 7 *            压缩后的文件名
 8  * @param zipFileName
 9 *            压缩后的文件名
10  * @throws IOException
11  *            抛出文件异常
12  */
13 publicstaticvoid ZIPFile(String sourceFileName, ZipOutputStream zos,
14         String tager) throws IOException {
15     //System.out.println(tager);
16     ZipEntry ze = new ZipEntry(tager);
17     zos.putNextEntry(ze);
18  
19     // 读取要压缩文件并将其添加到压缩文件中
20     FileInputStream fis = new FileInputStream(new File(sourceFileName));
21     byte[] bf = newbyte[2048];
22     int location = 0;
23     while ((location = fis.read(bf)) != -1) {
24         zos.write(bf, 0, location);
25     }
26     fis.close();
27 }

说明:这里写入zip文件流的时候使用了缓存,如果不使用将导致压缩的时间过长。。。(每次从硬盘读取一个字节并写入到zip文件流中,加重了硬盘的负担。。。)

经过我的机器测试,这个缓存设置1024与2048没有太多的性能差别,但是小于1024后就有较大的区别了。所以建议设置为1024或者2048。

第三个ZIPDIR方法,专门在ZIP文件中添加文件夹的方法。代码如下:

 1 /**
 2 * 压缩目录。除非有特殊需要,否则请调用ZIP方法来压缩文件!
 3  *
 4* @param sourceDir
 5 *            需要压缩的目录位置
 6  * @param zos
 7 *            压缩到的zip文件
 8  * @param tager
 9 *            压缩到的目标位置
10  * @throws IOException
11  *            压缩文件的过程中可能会抛出IO异常,请自行处理该异常。
12  */
13 publicstaticvoid ZIPDIR(String sourceDir, ZipOutputStream zos,
14         String tager) throws IOException {
15     //System.out.println(tager);
16     ZipEntry ze = new ZipEntry(tager);
17     zos.putNextEntry(ze);
18     // 提取要压缩的文件夹中的所有文件
19     File f = new File(sourceDir);
20     File[] flist = f.listFiles();
21     if (flist != null) {
22         // 如果该文件夹下有文件则提取所有的文件进行压缩
23         for (File fsub : flist) {
24             if (fsub.isDirectory()) {
25                 //如果是目录则进行目录压缩
26                 ZIPDIR(fsub.getPath(),zos, tager + fsub.getName() + "/");
27             } else {
28                 //如果是文件,则进行文件压缩
29                 ZIPFile(fsub.getPath(), zos,tager + fsub.getName());
30             }
31         }
32     }
33 }

 

说明:这里使用了递归的方式来读取要压缩的文件夹中的下级文件夹,全部将其压到zip文件中,用来组织好将来压缩好的zip文件里面的目录形式。

 

第四个UnZip方法,专门用于解压缩zip文件的方法。代码如下:

 1 /**
 2 * 解压缩zip文件
 3  *
 4* @param sourceFileName
 5 *            要解压缩的zip文件
 6  * @param desDir
 7 *            解压缩到的目录
 8  * @throws IOException
 9 *             压缩文件的过程中可能会抛出IO异常,请自行处理该异常。
10  */
11 publicstaticvoid UnZIP(String sourceFileName, String desDir)
12         throws IOException {
13     // 创建压缩文件对象, 注意指定格式与压缩时同样的格式
14     ZipFile zf = new ZipFile(new File(sourceFileName), "gb2312");
15  
16     // 获取压缩文件中的文件枚举
17     Enumeration<ZipEntry> en= zf.getEntries();
18     int length = 0;
19     byte[] b = newbyte[2048];
20  
21     // 提取压缩文件夹中的所有压缩实例对象
22     while (en.hasMoreElements()) {
23         ZipEntry ze = en.nextElement();
24         //System.out.println("压缩文件夹中的内容:"+ze.getName());
25         //System.out.println("是否是文件夹:"+ze.isDirectory());
26         // 创建解压缩后的文件实例对象
27         File f = new File(desDir +ze.getName());
28         //System.out.println("解压后的内容:"+f.getPath());
29         //System.out.println("是否是文件夹:"+f.isDirectory());
30         // 如果当前压缩文件中的实例对象是文件夹就在解压缩后的文件夹中创建该文件夹
31         if (ze.isDirectory()) {
32             f.mkdirs();
33         } else {
34             //如果当前解压缩文件的父级文件夹没有创建的话,则创建好父级文件夹
35             if(!f.getParentFile().exists()) {
36                 f.getParentFile().mkdirs();
37             }
38  
39             //将当前文件的内容写入解压后的文件夹中。
40             OutputStreamoutputStream = new FileOutputStream(f);
41             InputStream inputStream =zf.getInputStream(ze);
42             while ((length = inputStream.read(b)) > 0)
43                 outputStream.write(b, 0,length);
44  
45             inputStream.close();
46             outputStream.close();
47         }
48     }
49     zf.close();
50 }

解压缩的过程并不复杂,读取zip文件,提取里面的每个zip实体,然后将其解压缩。

如果该zip实体是目录,则在解压到的文件夹中创建文件夹,如果是文件,则在指定的目录中创建文件。

这个zip压缩与解压缩代码基本完毕,写个代码测试一下效果:

 1         try {
 2            long starTime = 0;
 3            long endTime = 0;
 4
 5            // 测试压缩目录
 6             // ZIPDIR("c:\\A",
 7            //"c:\\A.zip");
 8
 9            // 测试压缩单个文件
10             //ZIPFile("c:\\A.txt",
11             // "c:\\A.zip");
12
13             System.out.println("开始压缩...");
14             starTime =System.currentTimeMillis();
15             ZIP("c:\\A",
16                     "c:\\A.zip");
17             endTime =System.currentTimeMillis();
18             System.out.println("压缩完毕!花费时间: " + (endTime - starTime) + " 毫秒!");
19
20             System.out.println("开始解压...");
21             starTime =System.currentTimeMillis();
22             UnZIP("c:\\A.zip",
23                     "c:\\A\\");
24             endTime =System.currentTimeMillis();
25             System.out.println("解压完毕!花费时间: " + (endTime - starTime) + " 毫秒!");
26
27         } catch (Exception ex) {
28             //TODO Auto-generated catch block
29             ex.printStackTrace();
30         }


自己试了下很好用,分享给大家,本文转自百度文库

 

HarmonyOS 鸿蒙开发DevEco Studio OpenHarmony:安全测试 通过对HarmonyOS应用生命周期建模和应用攻击面建模,采用静态数据流分析技术,提高漏洞发现的准确率,同时覆盖20余种攻击面,65+漏洞测试项,帮助开发者提前发现和识别漏洞隐患。在检测报告中,会针对每一项漏洞风险项给出明确的修复建议,可以帮助开发者快速修复漏洞。 阅读详情

相关推荐

手把手教你搭建《黑色沙漠》单机版:从下载到联机的完整指南(含GM工具使用)

本文提供《黑色沙漠》单机版从下载安装到GM工具使用及局域网联机的完整教程。详细解析不同版本选择、系统配置要求、常见问题解决,并分享GM工具高级命令和局域网联机设置技巧,帮助玩家轻松搭建个性化游戏环境。

weixin_28738165的博客 468

java创建文件夹和遍历压缩文件夹或者文件

java创建文件夹和遍历压缩文件夹或者文件。

qq_19891197的博客 1103

西门子smart能搜到cpu但连接当前IP地址失败

将ip地址改到同一网段 本机为192.168.1.119就是192.168.1.1网段,但plc在192.168.0.1网段,所以显示ip连接失败,改为同一网段192.168.1.xxx即可(为避免ip冲突尽量改到200往后最大255)如果显示这一步,那么你的物理连接是没有问题的,应当是plc和电脑并不在同一网段导致的问题。输入ipconfig 查看本机网段与plc是否为同一网段。此电脑就不在同一网段所有造成通讯失败,接下来解决这个问题。win+r打开运行,打开cmd。再次尝试,如果还是报错,那么。

weixin_62678581的博客 9864

使用Java压缩文件生成各种zip包总结(整理为工具类版)

使用Java压缩文件生成各种zip包总结

httpmc2018的博客 1万+

从机械臂示教到厨房做饭:ACT模仿学习如何让机器人更“人性化”?

本文探讨了ACT(Action Chunking with Transformers)模仿学习技术如何让机器人更“人性化”,特别是在厨房等复杂场景中的应用。通过动作分块(Action Chunking)和时态融合(Temporal Ensemble)技术,机器人能够像人类一样记忆和执行复杂任务,如烹饪。文章还分析了ACT在家庭场景中的落地挑战及其在康复医疗、柔性制造等领域的跨领域应用潜力。

weixin_30613343的博客 255

PIV实验流场流速云图(MALAB contour函数用法)

clear;clc; for k=1:5 str1=['filename1']; str2=['filename2']; str3=['filename3']; str=eval(['str',num2str(k)]); load(str); [m n]=size(y); y=flipud(y); v=-v; x=x-x(1,...

Nick_Cui的博客 3223

Java实现多级目录文件下载压缩包

Java实现多级目录文件下载压缩包

kdjfh的博客 3255

21、二维卷积层(convolution2dLayer)的全面解析

本文全面解析了二维卷积层(convolution2dLayer)的原理、属性和应用,详细介绍了其在深度学习中的作用及实现方法。文章涵盖创建卷积层的语法、参数设置、算法原理、输入输出格式、优化策略以及实际应用案例,旨在帮助读者更好地理解和应用二维卷积层构建高效的深度学习模型。

red88的博客 317

Windows里的压缩包在Linux中解压

passwd.gz[root@localhost lianxi]# sz passwd.gz 发送文件到windows --》将linux系统里的文件传输到windows系统[root@localhost ~]# rz 接受从windows系统里传输文件到linux received。

ZhouXin1111112的博客 3134

02 HCM CPI SF集成-组织集成(一)

将员工主数据和组织数据从SAP Successfactors Employee CentraI复制到SAPERP或SAP S/4HANA,SAP SF CPI HCM集成

SAP CPI 129

YOLO26 正式发布源代码!极致速度优化方案, 面向工业级落地的目标检测模型!

YOLO26 作为 Ultralytics 公司于 2025 年 9 月发布的最新一代目标检测模型,在架构设计和技术实现上展现了显著的创新。本文深入分析了 YOLO26 的核心架构改进和技术原理,重点探讨了其在边界框回归、推理流程、损失函数设计和优化算法方面的突破性进展。

魔改工程师的博客 1243

centos7 安装seata + springboot配置

实际上只是部署一个单例的Seata,但是仍然按照集群的方式去配置。Seata的高可用依赖于注册中心、配置中心和数据库来实现;因此我们需要修改相关的配置。下面我们以nacos(注册中心和配置中心)和MySQL为例子,Seata-Server使用注册中心进行集群间的通信,同时将事务数据保存到数据库中让整个集群统一使用事务信息。 关于nacos安装,请参考:centos7 部署nacos_wdquan19851029的专栏-优快云博客 1.安装mysql数据库 本文使用yum安装 首先添加mysql 的

wdquan19851029的专栏 5340

【微信小程序】微信小程序开发环境搭建:安装微信小程序开发者工具

通过本文的介绍,你应该已经成功安装并配置了微信小程序开发者工具,为微信小程序开发做好了准备。接下来,你可以开始编写你的第一个小程序项目,探索更多有趣的功能和特性。祝你开发顺利,创造更多优秀的作品!

墨夶的博客 2950

java zip压缩/解压工具类 ZipUtil

if (flist.length == 0) {// 如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点。} else {// 如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩。} else {// 如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中。// 取出文件夹中的文件(或子文件夹)// 将源文件写入到zip文件中。

shengguimin的博客 1149

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java创建zip压缩文件

一.java压缩文件夹demo 这里给的demo是压缩整个文件夹,如果需要压缩单个文件需要你自己更改一下. import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * @ClassName File2Zip * @Auther LangGuofeng * @D...

老狼的博客 4437

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Android开发】如何打包压缩文件、文件夹?

在开发Android应用过程中,基本都会遇到需要压缩文件的需求,比如打包日志文件上传等功能,今天就来看看如何开发一个通用的工具类用于压缩文件或文件夹。这样我们就可以打包压缩文件或文件夹了,为了方便可以封装成一个工具类,方便以后使用。我自己整理了一个工具类,大家有需要可以关注微信公众号“BennuCTech”,发送“ZipFile”获取完整代码。

公众号:BennuCTech 1443

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java压缩文件方法

总结一下实现压缩文件的几个步骤: 1.创建压缩文件的对象(一旦创建对象,就会创建对应名称的压缩文件) 2.创建文件入口(这里传入的参数是压缩文件中的路径,可随意) 3.通过putNextEntry方法移动到入口上 4.进行你所需要的操作 5.关流 前三步是必须的,当然最后关流也是必须的 package com.baishiwei.myFileDemo; import java.io.File; ...

bsw451926392的博客 1157

java 压缩文件 文件夹

java 压缩文件、文件夹 功能部分使用java 原生api ,第三方依赖 ant 是为解决中文乱码 maven依赖 <!-- 解决 Zip 中文乱码 --> <dependency> <groupId>ant</groupId> <artifactId>ant</...

qq_35425070的博客 247

java 压缩文件的方法_java压缩文件方法

总结一下实现压缩文件的几个步骤:1.创建压缩文件的对象(一旦创建对象,就会创建对应名称的压缩文件)2.创建文件入口(这里传入的参数是压缩文件中的路径,可随意)3.通过putNextEntry方法移动到入口上4.进行你所需要的操作5.关流前三步是必须的,当然最后关流也是必须的package com.baishiwei.myFileDemo;import java.io.File;import jav...

weixin_39681161的博客 314

java解压包含多个文件夹的压缩包

Java解压包含多个文件夹的压缩包 在日常开发中,我们经常会遇到需要解压包含多个文件夹的压缩包的情况。在Java中,我们可以通过使用Java标准库中的java.util.zip包来实现解压操作。本文将介绍如何使用Java来解压包含多个文件夹的压缩包,并提供代码示例。 解压步骤 解压包含多个文件夹的压缩包可以分为以下几个步骤...

weixin_40441635的博客 346

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

【代码】Java压缩文件和文件夹为zip格式。

西凉的悲伤博客 3401

java提供的压缩方法压缩文件夹(可以包含多个子文件夹)

直接复制过来用就行 public class EEETest { public static void main(String[] args) throws FileNotFoundException { String basePath = ""; String directoryName = "D:/DLL/d067f03f-840a-4462-9d67-045ff3960806/40"; ZipOutputStream zos = new Zi

京北游戏官方 2万+

Java压缩一个文件夹的方法

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * @ClassName: Compress.

寒夜二十五 1919

zipfile java_Java ZIP压缩文件使用总结

做Java Web开发,有时候遇到将多个文件或者文件夹压缩成一个.zip文件,供前端下载。Java的JDK中提供一个java.util.zip的接口,供大家使用。如下图:图上就是Java 的JDK提供的接口,但是压缩文件或者文件夹的时候,怎么使用上面的接口呢?下面我给出几个相关的接口,这些接口是下面压缩文件或者文件夹过程中使用到的。java.util.zip.ZipEntry;java.util....

weixin_42401137的博客 2417

java 生成zip如法打开_Java创建ZIP压缩文件的方法

本文实例讲述了Java创建ZIP压缩文件的方法。分享给大家供大家参考。具体如下:这里注意:建议使用org.apache.tools.zip.*包下相关类,否则可能会出现中文乱码问题。/*** 压缩文件夹* @param sourceDIR 文件夹名称(包含路径)* @param targetZipFile 生成zip文件名* @author liuxiangwei*/public static v...

weixin_28944305的博客 181

Java压缩文件/文件夹

ZipOutputStream流、递归压缩。 在关闭ZipOutputStream流之前,需要先调用flush()方法,强制将缓冲区所有的数据输出,以避免解压文件时出现压缩文件已损坏的现象。 /** * @param source 待压缩文件/文件夹路径 * @param destination 压缩后压缩文件路径 * @return */ public static boolean toZip(String source, String destination) {...

weixin_37672801的博客 4600
上一篇: Oracle dblink详解
肉鸡控
博客等级 码龄15年 2粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值