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

Java压缩与解压缩ZIP文件 小而美的使用JDK自带的ZIP工具包生成与解压缩ZIP文件 阅读详情

最近由于客户来回修改需求,使得我对代码也是反复修改,最终折腾完毕后,让我总结了3种Java生成的zip包。

1.普通zip包,解压后的样子与打包压缩前一模一样,直接解压即可。

过程如下:

打包E盘下packs文件夹中的内容,生成的zip包输出到E盘下,名称为packs.zip

具体代码实现过程注释即可。

import java.nio.file.Paths;


//compress方法需要传入2个参数,是两个地址
//第一个地址是目标打包文件的地址,第二个是zip包输出的地址
public static void main(String[] args) throws IOException {
        String hallFilePath = "E:/" +  "packs";
        compress(Paths.get(hallFilePath).toString(), hallFilePath + ".zip");
    }

//由此开始是所有相关的工具方法
public static void compress(String fromPath, String toPath) throws IOException {
        File fromFile = new File(fromPath);
        File toFile = new File(toPath);
        if (!fromFile.exists()) {
            throw new ServiceException(fromPath + "不存在!");
        }
        try (FileOutputStream outputStream = new FileOutputStream(toFile); CheckedOutputStream checkedOutputStream = new CheckedOutputStream(outputStream, new CRC32()); ZipOutputStream zipOutputStream = new ZipOutputStream(checkedOutputStream)) {
            String baseDir = "";
            compress(fromFile, zipOutputStream, baseDir);
        }
    }

    private static void compress(File file, ZipOutputStream zipOut, String baseDir) throws IOException {
        if (file.isDirectory()) {
            compressDirectory(file, zipOut, baseDir);
        } else {
            compressFile(file, zipOut, baseDir);
        }
    }

    private static void compressFile(File file, ZipOutputStream zipOut, String baseDir) throws IOException {
        if (!file.exists()) {
            return;
        }
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {
            ZipEntry entry = new ZipEntry(baseDir + file.getName());
            zipOut.putNextEntry(entry);
            int count;
            byte[] data = new byte[BUFFER];
            while ((count = bis.read(data, 0, BUFFER)) != -1) {
                zipOut.write(data, 0, count);
            }
        }
    }

    private static void compressDirectory(File dir, ZipOutputStream zipOut, String baseDir) throws IOException {
        File[] files = dir.listFiles();
        if (files != null && ArrayUtils.isNotEmpty(files)) {
            for (File file : files) {
                compress(file, zipOut, baseDir + dir.getName() + File.separator);
            }
        }
    }

压缩前的目标文件如下:

 压缩后输出的文件以及解压后:

2.压缩后的压缩包解压即是文件,不需要文件夹,就是上面的案例,解压后还有一个packs文件夹,这里跳过,解压出来就是文件列表:

大体步骤相似,打包时代码需要调整,先上全部的代码:

public static void main(String[] args) throws IOException {
        String hallFilePath = "E:/" +  "packs";
        compress(Paths.get(hallFilePath).toString(), hallFilePath + ".zip");
    }

public static void compress(String fromPath, String toPath) throws IOException {
        File fromFile = new File(fromPath);
        File toFile = new File(toPath);
        if (!fromFile.exists()) {
            throw new ServiceException(fromPath + "不存在!");
        }
        try (FileOutputStream outputStream = new FileOutputStream(toFile); CheckedOutputStream checkedOutputStream = new CheckedOutputStream(outputStream, new CRC32()); ZipOutputStream zipOutputStream = new ZipOutputStream(checkedOutputStream)) {
            String baseDir = "";
            compress(fromFile, zipOutputStream, baseDir);
        }
    }

    private static void compress(File file, ZipOutputStream zipOut, String baseDir) throws IOException {
        if (file.isDirectory()) {
            compressDirectory(file, zipOut, baseDir);
        } else {
            if (baseDir.equals("packs" + File.separator)) {
                baseDir = File.separator;
            } else if (baseDir.equals("packs" + File.separator + "examineeInfo" + File.separator)) {
                baseDir = "examineeInfo" + File.separator;
            }
            compressFile(file, zipOut, baseDir);
        }
    }

    private static void compressFile(File file, ZipOutputStream zipOut, String baseDir) throws IOException {
        if (!file.exists()) {
            return;
        }
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {
            ZipEntry entry = new ZipEntry(baseDir + file.getName());
            zipOut.putNextEntry(entry);
            int count;
            byte[] data = new byte[BUFFER];
            while ((count = bis.read(data, 0, BUFFER)) != -1) {
                zipOut.write(data, 0, count);
            }
        }
    }

    private static void compressDirectory(File dir, ZipOutputStream zipOut, String baseDir) throws IOException {
        File[] files = dir.listFiles();
        if (files != null && ArrayUtils.isNotEmpty(files)) {
            for (File file : files) {
                compress(file, zipOut, baseDir + dir.getName() + File.separator);
            }
        }
    }

这里主要是有第二个compress方法来处理:

由于文件夹结构如下:

 这个方法在打包时,将外层的文件夹去掉,只保留内部文件夹

private static void compress(File file, ZipOutputStream zipOut, String baseDir) throws IOException {
        if (file.isDirectory()) {
            compressDirectory(file, zipOut, baseDir);
        } else {
            //如果是文件夹,进来判断,是最外层packs文件夹还是内部的examineeInfo文件夹
            //是最外层的则忽略掉,是内部的则把外层文件夹名称去掉
            if (baseDir.equals("packs" + File.separator)) {
                baseDir = File.separator;
            } else if (baseDir.equals("packs" + File.separator + "examineeInfo" + File.separator)) {
                baseDir = "examineeInfo" + File.separator;
            }
            compressFile(file, zipOut, baseDir);
        }
    }

这样压缩后的zip包解压后,直接出现文件,没有最外层文件夹:

3.压缩时给zip包添加密码:

打出一个带解压密码的zip包:

程序运行示例截图: 

示例代码:

public static void main(String[] args) {
        //随机密码生成工具
        String ownerPassword = PdfEncryptUtil.getCharAndNum(20);
        //打包目标文件夹
        String hallFilePath = "E:" + File.separator+ "packs";
        //压缩包输出文件夹
        String outPath = "E:" +File.separator+ "examineeInfo.zip";
       //调用压缩方法zip进行压缩,参数含义下面介绍,返回的是压缩包的输出路径
        String zipPath = zip(hallFilePath, outPath, false, "ceshi");
        //打印出来 
        System.out.println(zipPath);
    }

zip方法工具中的方法:

/**
     * 使用给定密码压缩指定文件或文件夹到指定位置.
     * <p>
     * dest可传最终压缩文件存放的绝对路径,也可以传存放目录,也可以传null或者""
     * 如果传null或者""则将压缩文件存放在当前目录,即跟源文件同目录,压缩文件名取源文件名,以.zip为后缀;
     * 如果以路径分隔符(File.separator)结尾,则视为目录,压缩文件名取源文件名,以.zip为后缀,否则视为文件名.
     *
     * @param src         要压缩的文件或文件夹路径
     * @param dest        压缩文件存放路径
     * @param isCreateDir 是否在压缩文件里创建目录,仅在压缩文件为目录时有效.
     *                    如果为false,将直接压缩目录下文件到压缩文件.
     * @param passwd      压缩使用的密码
     * @return 最终的压缩文件存放的绝对路径, 如果为null则说明压缩失败.
     */
public static String zip(String src, String dest, boolean isCreateDir, String passwd) {
        File srcFile = new File(src);
        dest = buildDestinationZipFilePath(srcFile, dest);
        ZipParameters parameters = new ZipParameters();
        // 压缩方式
        parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
        // 压缩级别
        parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
        if (!StringUtils.isEmpty(passwd)) {
            parameters.setEncryptFiles(true);
            // 加密方式
            parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
            parameters.setPassword(passwd.toCharArray());
        }
        try {
            ZipFile zipFile = new ZipFile(dest);
            if (srcFile.isDirectory()) {
                // 如果不创建目录的话,将直接把给定目录下的文件压缩到压缩文件,即没有目录结构
                if (!isCreateDir) {
                    File[] subFiles = srcFile.listFiles();
                    for (int i = 0; i < subFiles.length; i++) {
                        if (subFiles[i].isDirectory()) {
                            zipFile.addFolder(subFiles[i], parameters);
                        } else {
                            ArrayList<File> temp = new ArrayList<File>();
                            Collections.addAll(temp, subFiles[i]);
                            zipFile.addFiles(temp, parameters);
                        }
                    }
                    return dest;
                }
                zipFile.addFolder(srcFile, parameters);
            } else {
                zipFile.addFile(srcFile, parameters);
            }
            return dest;
        } catch (ZipException e) {
            e.printStackTrace();
        }
        return null;
    }

    private static String buildDestinationZipFilePath(File srcFile, String destParam) {
        if (StringUtils.isEmpty(destParam)) {
            if (srcFile.isDirectory()) {
                destParam = srcFile.getParent() + File.separator + srcFile.getName() + ".zip";
            } else {
                String fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));
                destParam = srcFile.getParent() + File.separator + fileName + ".zip";
            }
        } else {
            // 在指定路径不存在的情况下将其创建出来
            createDestDirectoryIfNecessary(destParam);
            if (destParam.endsWith(File.separator)) {
                String fileName = "";
                if (srcFile.isDirectory()) {
                    fileName = srcFile.getName();
                } else {
                    fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));
                }
                destParam += fileName + ".zip";
            }
        }
        return destParam;
    }

    private static void createDestDirectoryIfNecessary(String destParam) {
        File destDir = null;
        if (destParam.endsWith(File.separator)) {
            destDir = new File(destParam);
        } else {
            destDir = new File(destParam.substring(0, destParam.lastIndexOf(File.separator)));
        }
        if (!destDir.exists()) {
            destDir.mkdirs();
        }
    }

这里打包出来的加密zip包也是解压开就是文件列表的格式,没有最外层文件夹包裹,如果想要最外层文件夹包裹,只需要改动下zip方法的try块中的if...else语句即可:

try {
            ZipFile zipFile = new ZipFile(dest);
            if (srcFile.isDirectory()) {
                // 如果不创建目录的话,将直接把给定目录下的文件压缩到压缩文件,即没有目录结构
                if (!isCreateDir) {
                    File[] subFiles = srcFile.listFiles();
                    ArrayList<File> temp = new ArrayList<File>();
                    Collections.addAll(temp, subFiles);
                    zipFile.addFiles(temp, parameters);
                    return dest;
                }
                zipFile.addFolder(srcFile, parameters);
            } else {
                zipFile.addFile(srcFile, parameters);
            }
            return dest;
        } catch (ZipException e) {
            e.printStackTrace();
        }

生成效果:

注意:

1.zip包输出地址在定义时,一定要以.zip结尾,否则会出错。

2.代表文件夹层级关系的/在有的方法中,或者linux服务器上不识别,最好使用File.separator来表示层级,上面我也有用到过。

3.密码最好使用动态生成的密码,来提高安全性。

压缩的方法很多,工作之余匆匆记录,肯定有不是很合理很全面的地方,有大佬看到欢迎指点。

JAVA开发 选择指定的文件生成ZIP压缩包 案例简述:通过启动java代码来打开文件选择器对话框,用户选择确认需要进行压缩的文件,选择完毕后点击按钮确认,指定位置自动生成包含该文件的压缩包。 阅读详情

相关推荐

java如何打包文件成zip,java如何压缩文件,file.mkdir和mkdirs的区别

java

zhangfuping123456789的博客 1万+

【Java 基础篇】Java Zip压缩:简化文件和文件夹的压缩操作

Zip压缩是一种常见的文件压缩格式,它将多个文件和文件夹打包成一个以.zip为后缀的压缩包。压缩后的文件可以减小存储空间和网络传输的大小,并方便地进行传输和共享。Java的Zip压缩库提供了一组API,用于创建、读取和解压缩Zip文件。通过本文,我们学习了如何使用Java的Zip压缩库来压缩和解压缩文件。我们学习了如何创建压缩文件、压缩多个文件、压缩文件夹以及解压缩文件。Zip压缩是Java开发中常用的文件操作之一,能够简化文件和文件夹的压缩和解压缩操作。

繁依Fanyi的博客 1万+

PG-FP6编程器错误代码解析与高效排障实战指南

在嵌入式系统开发与量产烧录中,编程器是连接开发环境与目标硬件的重要桥梁。其工作原理是通过特定的通信协议(如UART、SWD)与微控制器(MCU)建立连接,完成程序代码的写入、擦除与校验。这项技术的核心价值在于确保固件能够准确、可靠地部署到硬件中,是产品从原型到量产的关键环节。在实际的工程实践中,尤其是在使用瑞萨(Renesas)PG-FP6这类编程器进行调试或批量生产时,工程师常会遇到各种通信失败、编程验证错误或电源异常等问题,这些问题往往以特定的错误代码形式呈现。深入理解这些错误代码背后的硬件连接、电源时

weixin_34387468的博客 580

JAVA:代码实现zip压缩

主要介绍了Java实现把文件及文件夹压缩成zip。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考价值,需要的朋友可以参考下。

熬过万丈孤独,藏下星辰大海 1万+

STM32 FMC驱动AD7606实战:从硬件连接到时序调试全流程解析

本文详细解析了STM32 FMC驱动AD7606的全流程,包括硬件连接、FMC接口配置、驱动程序设计和时序调试。通过实战案例,展示了如何利用STM32的FMC总线实现与AD7606的高效数据传输,特别强调了电源设计、信号连接和PCB布局等关键要点,为嵌入式数据采集系统开发提供了实用指导。

aa123的博客 1004

Skyworks SKY85331-11的Wi-Fi 6 (802.11ax)标准 2.4G 高功率WLAN前端模块解决方案

SKY85331-11是高度集成的2 GHz前端模块(FEM)包含2 GHz单刀双掷(SPDT)发送/接收(T / R)开关,2 GHz低噪声放大器(LNA)带旁路和一个2 GHz功率放大器(PA),用于大功率802.11ax应用程序和系统LNA和PA禁用功能可确保低漏电流 关闭模式。 包括一个集成的功率检测器以提供系统内的闭环功率控制。该设备提供Small (24-pin, 3 x 5 mm) (LGA)封装。 图1.引脚配置和封装如图所示 图2.信号引脚分配和功能引脚描述 图...

zhangbao19890622的博客 4504

java 万能解压zip工具类

项目中有需要解压zip包,但是网上搜了下,工具类过于局限,故整理一个万能的解压zip的工具类。 局限点:只支持解压

weixin_42967013的博客 1452

Claude Code 实战指南:从入门到高效编程

本文是一份Claude Code实战指南,旨在帮助开发者从入门到精通这款AI编程助手。文章详细讲解了如何通过清晰的指令公式与Claude Code高效沟通,并展示了如何将其深度集成到日常开发工作流中,例如理解陌生代码、调试和生成测试文档。指南还提供了避坑建议与最佳实践,并通过构建一个天气查询CLI工具的完整案例,演示了如何利用Claude Code加速开发进程,实现从设计到代码的高效人机协作。

weixin_28339967的博客 484

java使用ZipOutputStream时出现的“不可预料的压缩文件末端”问题

java使用ZipOutputStream时出现的“不可预料的压缩文件末端”问题1. 问题2. 过程3. 原因表象深究本质4. 结论 上面有目录,嫌麻烦的可以直接看结论 1. 问题   之前使用java自带的压缩工具,ZipOutputStream写了一个压缩文件的方法。前几天整理代码的时候,更改了关流方式,同时整理了一下代码结构。当时没有注意重新测试这个方法,今天使用调用这个工具方法的接口时,发现生成的压缩文件不可读,出现 不可预料的压缩文件末端 的问题。   问题在于,这个压缩方法在许久之前是可以

shenpengyus的博客 6758

Synopsys工具链实战:如何用VCS、DC、ICC和Calibre跑通你的第一个数字IC设计项目?

本文详细介绍了如何使用Synopsys工具链(VCS、Design Compiler、ICC和Calibre)完成数字IC设计项目,从RTL代码到GDSII版图的全流程。涵盖环境配置、RTL设计验证、逻辑综合、物理实现及签核验证等关键步骤,帮助工程师掌握高效的数字IC设计流程。

weixin_42525005的博客 196

AWS RDS 介绍 三)创建 RDS 实例

AWS RDS 介绍 共分为 7 个部分, 其中 第 3部分重点介绍,如何创建一个RDS 实例。 三) AWS RDS 试用MySQL http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.

XuYongshi02的专栏 7646

html解压zip文件怎么打开方式,使用zip.js压缩文件和解压文件

官方例子支持在线演示效果。研究的目的是:如何获取zip包中的信息并读取传输(其实使用JAVA或者node.js更容易实现,之所以使用js也是因为业务的特殊性)。准备库:下载成功解压是这样的,如图所示:和分别在dist和vendor目录下jszip-utils.js 在dist目录下一、使用zip.js压缩生成zip包源码如下:function test(){var zip = newJSZip()...

weixin_34093995的博客 2864

【MicroPython编程-ESP32篇:设备驱动】-BNO08X系列传感器驱动

BNO08X 系列(BNO085/BNO086)是一款系统级封装 (SiP),集成了三轴加速度计、三轴陀螺仪、磁力计以及运行 CEVA SH-2 固件的 32 位 ARM® Cortex™-M0+ 微控制器。SH-2 包含 MotionEngine™ 软件,该软件提供复杂的信号处理算法来处理传感器数据,并提供精确的实时 3D 姿态、航向、校准加速度和校准角速度,以及更高级的上下文输出。BNO08X 集成在一个 28 引脚 LGA 封装中,尺寸为 3.8mm x 5.2mm x 1.1mm。它兼容 Andro

视觉与物联智能 692

JAVA压缩本地文件成ZIP包,完成后删除

这个方法可以将指定文件夹中的文件压缩成zip包,参考了别人的文章修改成的(参考文章找不到了,这是我完成功能后有空整理的代码,如果侵权请联系我删除),并加上了删除指定路径下的文件,可以保证在服务器上存放临时文件的文件夹为空,这样直接压缩该文件夹的所有文件就可以了 package cc.mrbird.febs.server.system.utils; import org.springframework.stereotype.Component; import javax.servlet.http.Http

m0_52835521的博客 2270

使用MiniExcel.SaveAsByTemplate快速地保存百万数据

该代码展示了如何使用MiniExcel快速生成并导出百万级销售数据。核心方法GenerateLargeData()可生成指定数量的随机销售记录,包含客户名、日期、VIP状态、积分等20个字段。通过随机函数模拟真实数据分布,并支持自定义数据量(默认100万条)。配合Excel模板使用MiniExcel.SaveAsByTemplate()方法,能高效地将大数据量导出为Excel文件,且处理速度极快。代码结构清晰,包含数据生成、随机日期辅助方法和数据模型类,适合需要批量生成测试数据或导出大型报表的场景。

大坡3D软件开发 253

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java实现解压zip压缩包(支持多层级)

最常见的压缩文件格式之一,可以存储一个或多个文件,并可在不同的操作系统中进行解压缩。

总结分享 4289

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java 解析 Linux 不同压缩文件的方法及注意事项

commons-compress 包提供了归档压缩文件的工具类,java.util 里面包含了 Zip 和 gz 文件的解压方法,最终以按扁平方式,遍历到全部文件的文件,包括子目录下的文件。使用 Java 实现的日志采集系统涉及到对压缩文件的解析,不同类型的压缩文件,Java 解析方式也不相同,本文整理 Java 解析四类常见压缩文件的方法及注意事项。

本博客纯属个人网络笔记,如对阁下有用,甚喜;否则,关掉即可,不喜勿喷。专心写代码,不做键盘侠! 639

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Apache Commons工具类库使用整理

Apache Commons 工具类库分类 - commons-lang3 - commons-io - commons-pool2 - commons-codec - commons-collections4 - commons-math3 - commons-compress - commons-net - commons-csv - commons-configuration2 - commons-text

骑个小蜗牛的博客 2677

java解析压缩文件,支持zip,rar,7z压缩格式

java解析压缩文件,支持zip,rar,7z压缩格式

weixin_44330810的博客 2063

java压缩文件并把压缩包加密

给大家整理了一些有关【压缩包,Java】的项目学习资料(附讲解~~):https://edu.51cto.com/course/24152.htmlhttps://edu.51cto.com/course/35714.htmlJava压缩文件并把压缩包加密 在信息技术飞速发展的时代,文件管理成为了我们日常工作中不可或缺...

weixin_40593598的博客 1044

Java Zip压缩实现(亲测)

最近在自学javaWeb,先复习一下java,把还给老师的东西再找回来(知识如果不用很快就会忘记啊)。。 今天看到了zip压缩,决定要整理一下。 java将有关zip压缩的内容都封装在java.util.zip宝中,用java实现zip压缩,不用考虑压缩算法,java已经将这些进行了封装 实际上用java实现zip压缩涉及的就是一个“输入输出流”的概念 用java实现一个文件的zip压缩,过程可以简单地表示为: 当然具体实现要比这个复杂一点,比如要先像zip文件中写入目录进入点。。如果要压

gb4215287的博客 8815

JAVA基础篇【工具类】ZipUtil zip工具类 TG【20130318整理】

[code="java"]import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import ...

elfy-suen 702

Java代码实现解压文件包和压缩文件的工具类

java解压压和压缩文件的工具类,网上找了一些,自己补充一下,现在先分享一下,希望对各位同学有所帮助!

Maomaoqifeng的博客 857

Java解压zip流文件

我整理的一些关于【Java】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/bLN8S1Java解压zip流文件详解 在现代软件开发中,处理压缩文件是一项常见的任务。Java提供了丰富的库支持来解压zip文件。本篇文章将详细介绍如何使用Java解压zip流文件的过程,适合刚入...

weixin_27653327的博客 226

如何生成压缩文件文件(zip)

在做项目的过程中需要将文件打成压缩包 供用户下载使用,所以借鉴了网上的部分代码,经过自己的整理已进行了应用,代码如下: package com.zzxb.zip; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStr

qq_17677725的博客 6424
上一篇: Java生成导出xml文件(图文代码说明,拷贝直接可用)
下一篇: Java统计指定目录下文件夹数量和内部文件的数量并导出
mmm.c
博客等级 码龄9年 117粉丝 62原创
评论 17
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值