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,一经查实,立即删除!

相关文章

######## redis各章节终篇索引(更新中) ############

其他 父子关系&#xff08;ctx、协程&#xff09;#### golang存在的父子关系 ####_子goroutine panic会导致父goroutine挂掉吗-CSDN博客 参数传递&#xff08;slice、map&#xff09;#### go中参数传递&#xff08;涉及&#xff1a;切片slice、map、channel等&#xff09; ###…

TCPListen客户端和TCPListen服务器

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

ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的侧信道抵御

安全之安全(security)博客目录导读 目录 一、系统PMU计数器 二、使用信号和功耗操作进行的故障攻击 一、系统PMU计数器 性能监测单元 (PMU) 计数器可能成为泄露机密信息的侧信道,如访问模式或受RME安全保障保护的安全状态下的执行控制流。以下规则补充了《Arm CoreSight™…

(message): No CUDA toolset found.

解决方法&#xff1a; C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\visual_studio_integration\MSBuildExtensions\ 下的4个文件 复制到 D:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VC\v170\BuildCustomizations\下。…

据阿谱尔统计显示,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…

FreeSWITCH入门到精通系列(三):FreeSWITCH基础概念与架构

FreeSWITCH入门到精通系列&#xff08;三&#xff09;&#xff1a;FreeSWITCH基础概念与架构 前言 在前两篇博客中&#xff0c;我们介绍了FreeSWITCH的基本概念和安装与配置。本篇文章将深入探讨FreeSWITCH的基础概念和架构&#xff0c;帮助您更好地理解这个强大的通信平台的…

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;对于小程序开发者来…

深度学习模型的训练时间:影响、意义与应用范围

深度学习模型的训练时间&#xff1a;影响、意义与应用范围 在深度学习领域&#xff0c;训练时间是衡量模型性能的一个重要因素&#xff0c;但它能否决定模型的优劣和实际应用范围&#xff1f;本文将深入探讨训练时间对深度学习模型的具体影响、模型选择的考虑因素以及如何合理…

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…

Spring Boot中使用logback出现LOG_PATH_IS_UNDEFINED文件夹

1.首先查看&#xff0c;application.properties 文件是否按格式编写 logging.pathmylogs logging.configclasspath:logback-spring.xml2.查看 logback-spring.xml <springProperty scope"context" name"LOG_HOME" source"logging.path"/> …

SpringBoot整合SpringDataRedis

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

小程序中的模版语法

模板语法 今天我们来介绍一下小程序中的模版语法&#xff01;&#xff01;&#xff01; 1. 声明和绑定数据 小程序页面中使用的数据均需要在 Page() 方法的 data 对象中进行声明定义 在将数据声明好以后&#xff0c;需要在 WXML 中绑定数据&#xff0c;数据绑定最简单的方式…

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

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

ABAP调用JavaScript进行幂乘运算

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