Java 多文件压缩与解压

news2024/11/25 2:20:31

1,写多个文件到压缩包

	import org.apache.tools.zip.ZipEntry;
	import org.apache.tools.zip.ZipFile;
	import org.apache.tools.zip.ZipOutputStream;
 
    public static void main(String[] args) {
        //压缩文件对象
        String zipPath = "D:\\download\\files0719.zip";
        //需要压缩的文件
        String filepath1 = "D:\\download\\yyzz.jpeg";
        String filepath2 = "D:\\download\\yyzz1.png";
        List<String> files = new ArrayList<>();
        files.add(filepath1);
        files.add(filepath2);
        
        try (OutputStream os = new BufferedOutputStream(new FileOutputStream(zipPath));
             ZipOutputStream zos = new ZipOutputStream(os)) {
            byte[] buf = new byte[10240];
            int len;
            for (int i = 0; i < files.size(); i++) {
                File file = new File(files.get(i));
                //判断是否是文件数据
                if (!file.isFile()) {
                    continue;
                }
                zos.putNextEntry(new ZipEntry(file.getName()));
                try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {
                    while ((len = bis.read(buf)) > 0) {
                        zos.write(buf, 0, len);
                    }
                }
            }
        } catch (Exception e) {
            log.info("压缩文件{}失败", JSONUtils.toJSONString(files), e);
            throw new BaseException("压缩文件失败", e);
        }
    }
                    

效果图:
在这里插入图片描述

2,压缩文件解压

注意:可以用于递归文件的解压,但是不能对压缩文件里面的压缩文件进行解压

   public static void main(String[] args) {
        //解压文件
        String zipFile = "D:\\download\\filesCompress.zip";
        //解压到哪里
        String destination = "D:\\download\\unzip";
        ArrayList<String> dirList = new ArrayList<>();
        try (ZipFile zip = new ZipFile(zipFile, "GBK")) {
            //解压对象下有几个对象
            Enumeration<ZipEntry> en = zip.getEntries();
            byte[] buffer = new byte[8192];
            int length = -1;
            while (en.hasMoreElements()) {
                //获取文件实体
                ZipEntry entry = en.nextElement();
                //如果是目录
                if (entry.isDirectory()) {
                    dirList.add(entry.getName());
                    continue;
                }

                InputStream input = zip.getInputStream(entry);
                File file = new File(destination, entry.getName());
                //如果文件的父级目录不存在,创建目录
                if (!file.getParentFile().exists()) {
                    file.getParentFile().mkdirs();
                }
                try(BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));){
                    while (true) {
                        //向缓存区读取文件数据
                        length = input.read(buffer);
                        if (length == -1) {
                            break;
                        }
                        bos.write(buffer, 0, length);
                    }
                } finally {
                    if (input != null) {
                        try {
                            input.close();
                        } catch (IOException e) {
                            log.error(e.getMessage() == null ? "" : e.getMessage(), e);
                        }
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
               

效果图:
在这里插入图片描述

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

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

相关文章

15 大模型训练 内存优化

先看GPU结构&#xff0c;我们常说显存的时候&#xff0c;说的一般就是Global memory 训练的过程中&#xff0c;我们为了反向传播过程&#xff0c;必须将中间的结果&#xff08;激活值&#xff09;存储下来。 在训练的过程中&#xff0c;那些会消耗内存呢&#xff1f; model we…

ubuntu20.04系统安装使用labelme标注数据集

一、Anaconda的安装 请参考&#xff1a;MediapipeVSCodeAnaconda 实时检测手部关键点并保存视频_苦瓜汤补钙的博客-CSDN博客 二、Labelme的安装 1.打开终端创建虚拟环境 # 创建labelme的环境 conda create -n labelme python3.9 输入“y”&#xff0c;然后回车。 2.激活虚拟…

为什么媒体和创意工作者更喜欢 Splashtop 进行远程访问

在当今快速发展的数字环境中&#xff0c;可靠的远程访问已成为全球媒体和创意工作者不可或缺的工具。 远程访问让创意工作者不再受传统办公空间边界的限制&#xff0c;完全实现了随时随地办公。无论是实时剪辑、高分辨率渲染还是其他创意任务&#xff0c;创意工作者对高性能远…

Go语言之包管理

1、package Go语言是使用包来组织源代码的&#xff0c;包&#xff08;package&#xff09;是多个 Go 源码的集合&#xff0c;是一种高级的代码复用方案。Go语言中为我们提供了很多内置包&#xff0c;如 fmt、os、io 等。任何源代码文件必须属于某个包&#xff0c;同时源码文件的…

新书发布!《数字化时代研发效能跃升方法与实践》作者序丨IDCF

作者团队&#xff1a; 姚冬、王立杰、徐磊、许舟平 为什么会有本书 只是因为在人群之中&#xff0c;多看了你一眼。这一切&#xff0c;都要从IDCF的发端讲起 缘起IDCF 时间如白马过隙&#xff0c;我们成立IDCF一晃已有四年&#xff0c;而距离上一本书《敏捷无敌之DevOps时…

基于FME二开产品:NewGIS integration介绍

目录 前言 一、模板上传 二、模板在线运行 1.模板参数解析 2.模板运行 三、成果管理 总结 前言 爆肝两个月&#xff0c;我和我的团队终于打造出了一款能完美适配所有FME模板的在线模板管理平台&#xff0c;目前支持FME2021版本的所有模板的在线运行、管理。整体技术框架…

C++基础算法排序篇

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C算法 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要讲解C算法中所涉及到的两个排序算法&#xff0c;快排和归并。 文章…

请问支付功能如何测试

目录 01测试思维 02支付功能的测试点 一&#xff1a;支付的分类&#xff1a; 二&#xff1a;功能测试 三&#xff1a;接口测试 四&#xff1a;安全测试 五&#xff1a;测试点 01测试思维 要分析测试点之前&#xff0c;我们先来梳理一下测试思维。总结来说&#xff0c;任…

字符串编程练习(C++)

ex1 字符串变形 描述 对于一个长度为 n 字符串&#xff0c;我们需要对它做一些变形。 首先这个字符串中包含着一些空格&#xff0c;就像"Hello World"一样&#xff0c;然后我们要做的是把这个字符串中由空格隔开的单词反序&#xff0c;同时反转每个字符的大小写。…

【java】IntelliJ IDEA创建helloworld

目录 一、安装jdk17 二、安装InterliJ IDEA 2023.1.4 三、创建项目 四、创建模块 五、创建包 六、创建类 七、开始hello world 7.1 输入 psvm 7.2 输入sout 八、运行 九、IDEA 设置 9.1 主题 9.2 字体 9.3 背景色 十、快捷键 十一、导入模块 11.1方式一 1、先…

如何在无人机支持下完成自然灾害风险评估的原理和方法

对灾害的损失进行估算与测算是制定防灾、抗灾、救灾 及灾后重建方案的重要依据。 自然灾害评估按灾害客观地发展过程可分三种&#xff1a;一是灾前预评估&#xff0c;二是灾期跟踪或监测性评估&#xff0c;三是灾后实测评估。 灾前预评估要考虑三个因素&#xff0c;第一是未来…

将 QtPropertyBrowser 加入到 vs2015 qt版中工程中

我是直接将QtPropertyBrowser的所有文件当子文件夹全部加入到工程里的 加完之后&#xff0c;ok&#xff0c;编译错误 出现一堆以下错误&#xff0c;我只拿出一条 moc_qtbuttonpropertybrowser.cpp(94): error C2027: 使用了未定义类型“QtButtonPropertyBrowserPrivate” 然…

二级市场负重前行?腾讯音乐的“新伤”与“旧患”

炎炎夏日的7月&#xff0c;于腾讯音乐&#xff08;NYSE:TME、HK:01698&#xff09;而言并不太平。 先是&#xff0c;在7月5日&#xff0c;企鹅FM发布官方公告称由于业务调整&#xff0c;将于9月6日正式停止运营。 仅过十二天&#xff0c;7月17日&#xff0c;腾讯音乐发布公告&…

【Vue】报错:this.$refs 引用子组件报错 is not a function

文章目录 报错信息解决方法 报错信息 this.$refs.selectTree.onHide is not a function 解决方法 确保组件成功导出并挂载&#xff1a; - 子组件需要 import,import 是请确保路径正确import selectTree from /components/select-tree; - import 之后还需要在父组件的 comp…

ES6新增运算符

?. 可选链运算符 一个对象的属性&#xff0c;如果这个属性是对象&#xff0c;它还有子属性&#xff0c;访问这个子属性&#xff0c;比如 var obj {a: {key: val}} console.log(obj.a.key) // val 如果属性不存在的时候&#xff0c;则有可能会报错。 var obj {key: val} c…

预处理详解(一)---预定义符号

文章目录 预定义符号预定义符号的使用 预定义符号 在C语言中&#xff0c;有一些有意思的预定义符号&#xff0c;这些预定义符号都是语言内置的&#xff0c;即以及定义好的&#xff0c;我们可以直接使用。预定义符号主要有以下几个&#xff1a; __FILE__ //进行编译的源…

Windows安装激活注意事项

选择语言、版本&#xff08;Windows 10指的是专业版本&#xff09;和体系结构&#xff08;32位/64位&#xff09;&#xff0c;这里自行根据情况选择&#xff08;如果机器预装的是Windows 10家庭中文版则选择家庭中文版&#xff0c;如果预装的是专业版则选择Windows 10。这样原先…

vue(html,css,vue2,vue3) 学习总结

文章目录 小白 Vue 3 学习一些名词软件安装 VSCode 中的一些设置1. 关闭eslint检查tsconfig.json 配置文件2. ts 文件引用报红 相对路径写法常见图片格式和区别目录结构JS/TS1. prototype(原型对象)2. 导入/导出3. 去除字符串两端空格4. 一些特殊语法糖5. 深拷贝6. 拼接两个数组…

openGauss学习笔记-14 openGauss 简单数据管理-查看对象

文章目录 openGauss学习笔记-14 openGauss 简单数据管理-查看对象14.1 查看命令帮助信息14.2 切换数据库14.3 查询所有数据库14.4 查询当前数据库中的所有表14.5 查看表结构 openGauss学习笔记-14 openGauss 简单数据管理-查看对象 gsql工具提供了若干高级特性&#xff0c;便于…

Linux 漏洞扫描

Linux 漏洞扫描程序会仔细检查基于 Linux 的系统&#xff0c;以减轻潜在的风险和漏洞。 什么是 Linux 漏洞扫描程序 Linux 漏洞扫描程序是一种专门的漏洞扫描工具&#xff0c;旨在识别基于 Linux 的系统中的安全漏洞和弱点,它会扫描配置错误、过时的软件版本和已知漏洞。 为…