java实现文件的压缩及解压

news2024/10/6 20:31:16

一、起因

开发中需要实现文件的压缩及解压功能,以满足某些特定场景的下的需要,在此说下具体实现。

二、实现

1.定义一个工具类ZipUtils,实现文件的压缩及解压,代码如下:

import java.io.*;

import java.nio.charset.Charset;

import java.util.Enumeration;

import java.util.zip.ZipEntry;

import java.util.zip.ZipFile;

import java.util.zip.ZipOutputStream;

 

/**

 * ZIP解压缩工具

 */

public class ZipUtils {

    /**

     * 压缩文件/文件夹

     * 若压缩的为文件夹:则压缩包中第一层为该文件夹

     * 若压缩的为文件:则压缩包中第一层为该文件

     *

     * @param srcFilePath 源文件

     * @param zipFilePath zip

     */

    public static void compress(String srcFilePath, String zipFilePath) {

        File src = new File(srcFilePath);

        if (!src.exists()) {

            throw new RuntimeException(srcFilePath + "不存在");

        }

        File zipFile = new File(zipFilePath);

        try (ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)))) {

            String baseDir = "";

            compress(src, zos, baseDir);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

 

    /**

     * 压缩

     *

     * @param src

     * @param zos

     * @param baseDir

     */

    public static void compress(File src, ZipOutputStream zos, String baseDir) {

        if (!src.exists())

            return;

        if (src.isFile()) {

            compressFile(src, zos, baseDir);

        } else if (src.isDirectory()) {

            compressDir(src, zos, baseDir);

        }

    }

 

    /**

     * 压缩文件

     */

    private static void compressFile(File file, ZipOutputStream zos, String baseDir) {

        if (!file.exists())

            return;

        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {

            ZipEntry entry = new ZipEntry(baseDir + file.getName());

            zos.putNextEntry(entry);

            int count;

            byte[] buf = new byte[4096];

            while ((count = bis.read(buf)) != -1) {

                zos.write(buf, 0, count);

            }

        } catch (Exception e) {

        }

    }

 

    /**

     * 压缩文件夹

     */

    private static void compressDir(File dir, ZipOutputStream zos, String baseDir) {

        if (!dir.exists() || dir.isFile())

            return;

        File[] files = dir.listFiles();

        if (files != null) {

            if (files.length == 0) {

                try {

                    zos.putNextEntry(new ZipEntry(baseDir + dir.getName() + File.separator));

                } catch (IOException e) {

                    e.printStackTrace();

                }

            } else {

                for (File file : files) {

                    compress(file, zos, baseDir + dir.getName() + File.separator);

                }

            }

        }

    }

 

 

    /**

     * 解压文件

     *

     * @param zipFilePath

     * @param destDirPath

     */

    public static void unzip(String zipFilePath, String destDirPath) {

        File srcFile = new File(zipFilePath);

        unzip(srcFile, destDirPath);

    }

 

    /**

     * 解压文件

     *

     * @param srcFile

     * @param destDirPath

     */

    public static void unzip(File srcFile, String destDirPath) {

        if (!srcFile.exists()) {

            throw new RuntimeException(srcFile.getPath() + "所指文件不存在");

        } else if (!srcFile.isFile()) {

            throw new RuntimeException(srcFile.getPath() + "所指文件为文件夹");

        }

        try (ZipFile zipFile = new ZipFile(srcFile, Charset.forName("GBK"))) {

            Enumeration<?> entries = zipFile.entries();

            while (entries.hasMoreElements()) {

                ZipEntry entry = (ZipEntry) entries.nextElement();

                if (entry.isDirectory()) {

                    String dirPath = destDirPath + File.separator + entry.getName();

                    File dir = new File(dirPath);

                    dir.mkdirs();

                } else {

                    File targetFile = new File(destDirPath + File.separator + entry.getName());

                    if (!targetFile.getParentFile().exists()) {

                        targetFile.getParentFile().mkdirs();

                    }

                    targetFile.createNewFile();

                    InputStream is = zipFile.getInputStream(entry);

                    FileOutputStream fos = new FileOutputStream(targetFile);

                    int len;

                    byte[] buf = new byte[4096];

                    while ((len = is.read(buf)) != -1) {

                        fos.write(buf, 0, len);

                    }

                    fos.close();

                    is.close();

                }

            }

        } catch (Exception e) {

            throw new RuntimeException("unzip error from ZipUtils", e);

        }

    }

}

2.压缩和解压示例

提前在D盘根目录下新建一个文件夹,命名为1;在文件夹1里面再新建一个文件夹,命名为2;在文件夹2里面新建一个txt文档,名称任意,内容任意。最终文件结构为:

将下述调用代码与上述代码放于同一项目中,执行下述代码后,文件结构将变成

其中2.zip是压缩后的结果;文件夹3下的内容是解压2.zip后的结果。

public class Demo {

    public static void main(String[] args) {

        ZipUtils.compress("D:\\1\\2", "D:\\1\\2.zip");

        ZipUtils.unzip("D:\\1\\2.zip", "D:\\1\\3");

    }

}

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

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

相关文章

网络安全等级保护基本要求 第1部分:安全通用要求

基本要求 第三级 安全物理环境 物理位置选择 a) 机房场地应选择在具有防震、防风和防雨等能力的建筑内&#xff1b; b) 机房场地应避免设在建筑物的顶层或地下室&#xff0c;否则应加强防水和防潮措施 物理访问控制 a) 机房出入口应配置电子门禁系统&#xff0c;控制、鉴…

Linux 基本指令3

date指令 date[选项][格式] %Y--年 %m--月 %d--日 %H--小时 %M--分 %S--秒 中间可用其他符号分割&#xff0c;不能使用空格。 -s 设置时间&#xff0c;会返回设置时间的信息并不是改变当前时间 设置全部时间年可用-或者&#xff1a;分割日期和时间用空格分隔&#xff…

自动驾驶场景下TCP协议参数优化调整案例分享

RTT 往返时间&#xff0c;从tcp协议栈决定发包&#xff0c;到收到回包的时间。 包含本地驱动&#xff0c;网卡硬件&#xff0c;网线&#xff0c;交换机&#xff0c;收包方处理的耗时。需注意如果开了delayed ack&#xff0c;协议栈未做特殊处理&#xff08;默认没做&#xff…

攻防演练之-成功的钓鱼邮件溯源

书接上文&#xff0c;《网络安全攻防演练风云》专栏之攻防演练之-网络安全产品大巡礼二&#xff0c;这里。 演练第一天并没有太大的波澜&#xff0c;白天的时间过得很快。夜色降临&#xff0c;攻防演练中心内的灯光依旧明亮。对于网络安全团队来说&#xff0c;夜晚和白天并没有…

基于STM32和人工智能的智能家居监控系统

目录 引言环境准备智能家居监控系统基础代码实现&#xff1a;实现智能家居监控系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能家居环境监控与管理问题解决方案与优化收尾与总结 1. 引言 随着智能家居技术的发展&…

如何从微软官方下载Edge浏览器的完整离线安装包

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 正文内容 📒🚀 官方直链下载🚬 手动选择下载🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 在网上搜索Microsoft Edge浏览器的离线安装包时,很多用户都会发现大部分都是在线安装包,无法满足他们在无网络环境下进…

【日常记录】【vue】vite-plugin-inspect 插件的使用

文章目录 1、vite-plugin-inspect2、安装3、使用4、链接 1、vite-plugin-inspect vite-plugin-inspect 可以让开发者在浏览器端就可以看到vue文件编译后的代码、vue文件的相互依赖关系 2、安装 npm i -D vite-plugin-inspect// vite.config.ts import Inspect from vite-plugi…

基于STM32的简易智能家居设计(嘉立创支持)

一、项目功能概述 1、OLED显示温湿度、空气质量&#xff0c;并可以设置报警阈值 2、设置4个继电器开关&#xff0c;分别控制灯、空调、开关、风扇 3、设计一个离线语音识别系统&#xff0c;可以语音控制打开指定开关、并且可以显示识别命令词到OLED屏上 4、OLED实时显示&#…

Nginx06-rewrite模块详解与实验

目录 写在前面Nginx06nginx rewriterewrite 模块return案例01 访问/admin/ 返回403案例02 域名间跳转 if案例03 只允许GET、POST请求&#xff0c;其他禁止访问 set案例04 设置是否处于维护状态&#xff0c;是则返回503&#xff0c;否则正常访问 rewrite案例05 域名跳转案例06 r…

htb_Blurry

端口扫描 8 按照教程注册安装clear ml 加载configuration的时候会报错 将json里的API&#xff0c;File Store的host都添加到/etc/hosts中 即可成功初始化 查找clear ml漏洞 发现一个cve-2024-24590 下面是一个利用脚本&#xff0c;但不能直接用 ClearML-vulnerability-e…

5G消息 x 融媒 | 媒体融合新入口

5G消息 x 融媒 | 媒体融合新入口 5G 消息是 5G 时代三大运营商联合手机厂商推出的平台型应用&#xff0c;5G 消息以短信为入口&#xff0c;以富媒体消息为媒介&#xff0c;具有权威真实、全面覆盖、精准投放、内容汇聚、开放共享等特点。这些特点符合当下融媒体发展的需求&…

ubuntu下使用cmake编译opencv4.8.0+ffmpeg4.2.2+cuda11.1

1.源码下载 &#xff08;1&#xff09;下载ffmpeg4.2.2、opencv4.8.0源码&#xff0c;这里提供一个百度网盘地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1pBksr0_RtKL0cM6Gsf2MGA?pwdcyai 提取码&#xff1a;cyai &#xff08;2&#xff09;解压所有文件 例…

c++实现二叉搜索树(上)

宝贝们&#xff0c;好久不见&#xff0c;甚是想念&#x1f917;小吉断更了差多有10多天&#xff0c;在断更的日子里&#xff0c;小吉也有在好好学习数据结构与算法&#xff0c;但是学的并不多而且学的并不是很认真。主要是中途笔记本屏出现问题了&#xff08;这件事有点让小吉我…

迅狐短视频矩阵管理系统核心功能

一、多平台管理&#xff1a;连接多个主流自媒体平台&#xff0c;满足多平台、多账号、多角色的协调需求 在现如今的多元化媒体环境中&#xff0c;一个优秀的内容创作者需要同时管理多个自媒体平台&#xff0c;并以不同的身份角色展现自己。迅狐短视频矩阵管理系统强大的多平台…

RPC(远程过程调用):技术原理、应用场景与发展趋势

摘要&#xff1a; RPC&#xff08;Remote Procedure Call&#xff09;是一种通信协议&#xff0c;用于实现跨网络的进程间通信。它提供了一种简单高效的方式&#xff0c;使得分布式系统中的不同组件能够像调用本地函数一样调用远程函数。本篇博客将介绍RPC的基本概念&#xff0…

kafka 快速上手

下载 Apache Kafka 演示window 安装 编写启动脚本,脚本的路径根据自己实际的来 启动说明 先启动zookeeper后启动kafka,关闭是先关kafka,然后关闭zookeeper 巧记&#xff1a; 铲屎官&#xff08;zookeeper&#xff09;总是第一个到&#xff0c;最后一个走 启动zookeeper call bi…

虚拟声卡实现音频回环

虚拟声卡实现音频回环 一、电脑扬声器播放声音路由到麦克风1. Voicemeeters安装设置2. 音频设备选择 二、回声模拟 一、电脑扬声器播放声音路由到麦克风 1. Voicemeeters安装设置 2. 音频设备选择 以腾讯会议为例 二、回声模拟 选中物理输入设备“Stereo Input 1”和物理输出设…

浅谈内联钩取原理与实现

前言 导入地址表钩取的方法容易实现但是存在缺陷&#xff0c;若需要钩取的函数不存在导入地址表中&#xff0c;那么我们就无法进行钩取&#xff0c;出现以下几种情况时&#xff0c;导入函数是不会存储在导入地址表中的。 延迟加载&#xff1a;当导入函数还没调用时&#xff0…

Rust 实战丨通过实现 json! 掌握声明宏

在 Rust 编程语言中&#xff0c;宏是一种强大的工具&#xff0c;可以用于在编译时生成代码。json! 是一个在 Rust 中广泛使用的宏&#xff0c;它允许我们在 Rust 代码中方便地创建 JSON 数据。 声明宏&#xff08;declarative macros&#xff09;是 Rust 中的一种宏&#xff0…

debug调试_以Pycharm为例

文章目录 作用步骤打断点调试调试窗口 作用 主要是检查逻辑错误&#xff0c;而非语法错误。 步骤 打断点 在需要调试的代码行前打断点&#xff0c;执行后会停顿在断点位置&#xff08;不运行&#xff09; 调试 右键“debug”&#xff0c;或者直接点击右上角的小虫子 调试…