java实现文件的压缩及解压

一、起因

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

二、实现

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.mzph.cn/diannao/26440.shtml

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

相关文章

TCPListen客户端和TCPListen服务器

创建项目 TCPListen服务器 public Form1() {InitializeComponent();//TcpListener 搭建tcp服务器的类&#xff0c;基于socket套接字通信的//1创建服务器对象TcpListener server new TcpListener(IPAddress.Parse("192.168.107.83"), 3000);//2 开启服务器 设置最大…

据阿谱尔统计显示,2023年全球凹版印刷机市场销售额约为9.1亿美元

根据阿谱尔 (APO Research&#xff09;的统计及预测&#xff0c;2023年全球凹版印刷机市场销售额约为9.1亿美元&#xff0c;预计在2024-2030年预测期内将以超过2.54%的CAGR&#xff08;年复合增长率&#xff09;增长。 由于对软包装和印刷包装的需求不断增长&#xff0c;全球凹…

数据分析-Excel基础函数的使用

Excel基础函数&#xff1a; sum:求和 sumif:单条件求和 sumifs:多条件求和 subtotal:根据筛选求和 if:逻辑判断 vlookup:连接匹配数据 match:查找数值在区域中的位置 index:根据区域的位置返回数值 match、index:一起使用&#xff1a;自动根据列名查找数据 sumifs、match、ind…

2.线性神经网络

目录 1.线性回归一个简化模型线性模型&#xff1a;可以看做是单层神经网络衡量预估质量训练数据参数学习显示解总结 2.基础优化方法小批量随机梯度下降总结 3.Softmax回归&#xff1a;其实是一个分类问题回归VS分类从回归到多类分类---均方损失Softmax和交叉熵损失 4.损失函数L…

web前端:作业三

1.回到顶部案例(固定定位) <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>#container{height: 5000px;border: 1px solid blue;}#back-button{width: 100px;height: 100px;border: 1px solid…

如何申请小程序SSL证书

在互联网时代&#xff0c;数据安全和用户隐私保护变得尤为重要。SSL证书作为网站、应用或小程序与用户之间建立安全连接的关键工具&#xff0c;其重要性不言而喻。SSL证书能够加密数据传输&#xff0c;防止信息被窃取&#xff0c;提升用户信任度&#xff0c;对于小程序开发者来…

Redux 与 MVI:Android 应用的对比

Redux 与 MVI&#xff1a;Android 应用的对比 在为 Android 应用选择合适的状态管理架构时可能会感到困惑。在这个领域中&#xff0c;有两种流行的选择是 Redux 和 MVI&#xff08;Model-View-Intent&#xff09;。两者都有各自的优缺点&#xff0c;因此在深入研究之前了解它们…

WebGIS开发:你还在纠结的10大问题合集!

问题1&#xff1a;GIS开发到底是学Java还是Python&#xff1f; Java是后端语言&#xff0c;Python更重数据分析和算法。 假设通常说的GIS开发是指Webgis&#xff0c;Web就是指网页端&#xff0c;所以我们说的GIS开发大部分情况下是指网页端的地图可视化开发。 GIS开发需要学…

工业烤箱设备厂家:专业制造,助力工业发展

随着现代工业的不断发展&#xff0c;工业烤箱设备在各个领域的应用越来越广泛。作为专业的工业烤箱设备厂家&#xff0c;我们致力于为客户提供高质量、高效率的烤箱设备&#xff0c;助力工业生产的顺利进行。 工业烤箱设备在工业生产中扮演着至关重要的角色。无论是电子、化工、…

Flask快速入门

Flask快速入门&#xff08;路由、CBV、请求和响应、session&#xff09; 目录 Flask快速入门&#xff08;路由、CBV、请求和响应、session&#xff09;安装创建页面Debug模式快速使用Werkzeug介绍watchdog介绍快速体验 路由系统源码分析手动配置路由动态路由-转换器 Flask的CBV…

SpringBoot整合SpringDataRedis

目录 1.导入Maven坐标 2.配置相关的数据源 3.编写配置类 4.通过RedisTemplate对象操作Redis SpringBoot整合Redis有很多种&#xff0c;这里使用的是Spring Data Redis。接下来就springboot整合springDataRedis步骤做一个详细介绍。 1.导入Maven坐标 首先&#xff0c;需要导…

Mysql中使用where 1=1有什么问题吗

昨天偶然看见一篇文章&#xff0c;提到说如果在mysql查询语句中&#xff0c;使用where 11会有性能问题&#xff1f;&#xff1f; 这着实把我吸引了&#xff0c;因为我项目中就有不少同事&#xff0c;包括我自己也有这样写的。为了不给其他人挖坑&#xff0c;赶紧学习一下&…

ABAP调用JavaScript进行幂乘运算

ECC版本没有内置的ipow运算函数&#xff0c;所以需要进行幂乘运算的话&#xff0c;可以采用调用JavaScript的方式来实现&#xff0c;参考代码如下&#xff1a;

集合java

1.集合 ArrayList 集合和数组的优势对比&#xff1a; 长度可变 添加数据的时候不需要考虑索引&#xff0c;默认将数据添加到末尾 package com.itheima;import java.util.ArrayList;/*public boolean add(要添加的元素) | 将指定的元素追加到此集合的末尾 | | p…

Chrome/Edge浏览器视频画中画可拉动进度条插件

目录 前言 一、Separate Window 忽略插件安装&#xff0c;直接使用 注意事项 插件缺点 1 .无置顶功能 2.保留原网页&#xff0c;但会刷新原网页 3.窗口不够美观 二、弹幕画中画播放器 三、失败的尝试 三、Potplayer播放器 总结 前言 平时看一些视频的时候&#xff…

Linux——自动化运维ansibe

一、自动化运维定义 自动化--- 自动化运维&#xff1a; 服务的自动化部署操作系统的日常运维&#xff1a;日志的备份、临时文件清理、服务器日常状态巡检、&#xff08;几乎包括了linux服务管理、linux 系统管理以及在docker 容器课程中涉及的所有内容&#xff09;服务架构的…

maven学习小结

背景 大佬指路我负责实践 目录结构 maven为项目提供一个标准目录结构 环境配置 下载maven包后解压&#xff0c;配置解压目录的bin到path变量&#xff0c;然后终端mvn -v&#xff0c;有回显则表明maven安装成功 pom POM&#xff0c;Project Object Model&#xff0c;项目对…

01_简单信号的连续和离散形式(2)

1. 单位阶跃信号 1.1离散 离散单位阶跃信号&#xff0c;也称为单位阶跃序列&#xff0c;是一个在离散时间信号分析中基础且重要的信号&#xff0c;用于描述在某个时间点后信号值发生突变的情形。它的定义如下&#xff1a; 离散单位阶跃信号具有以下几个重要性质和应用&#x…

Django中使用下拉列表过滤HTML表格数据

在Django中&#xff0c;你可以使用下拉列表&#xff08;即选择框&#xff09;来过滤HTML表格中的数据。这通常涉及两个主要步骤&#xff1a;创建过滤表单和处理过滤逻辑。 创建过滤表单 首先&#xff0c;你需要创建一个表单&#xff0c;用于接收用户选择的过滤条件。这个表单可…

【CT】LeetCode手撕—21. 合并两个有序链表

目录 题目1-思路2- 实现⭐21. 合并两个有序链表——题解思路 3- ACM实现 题目 原题连接&#xff1a;21. 合并两个有序链表 1-思路 双指针&#xff1a;题目提供的 list1 和 list2 就是两个双指针 通过每次移动 list1 和 list2 并判断二者的值&#xff0c;判断完成后将其 插入…