ZIP压缩输出流(将ZIP文件解压)

文章目录

  • 前言
  • 一、ZIP压缩输出流是什么?
  • 二、使用介绍
    • 1.使用方法
    • 2.实操展示
  • 总结

前言

        该篇文章相对应的介绍如何使用java代码将各种文件(文件夹)从ZIP压缩文件中取出到指定的文件夹中。解压流将ZIP文件中的文件以条目的形式逐一读取,数据写入对应创建的文件夹中。


一、ZIP压缩输出流是什么?

        Zip压缩输出流是指将数据从Zip文件中解压到指定文件的输出流。ZipInoutStream类可读取ZIP压缩格式的文件,包括已压缩和未压缩的条目(entry)。

二、使用介绍

1.使用方法

(1)构造方式:

new ZipInputStream(InputStream in);
//该构造方式参数 in 为输出流对象 

 (2)常用方法:

ZipInputStream类的常用方法
方法功能描述
read(byte[] b,int off,int len)读取字节数组b内off偏移量的位置,长度是len字节
available()判断是否已读完目前entry所指定的数据。已读完返回0,否则返回1
closeEntry()关闭当前ZIP条目并定位流以读取下一个条目
skip(long n)跳过当前ZIP条目中的指定字节数
getNextEntry()读取下一个ZipEntry,并将流内的位置移至该entry所指数据的开头
createZipEntry(String name)以指定的name参数新建一个ZipEntry对象

解压流程图

 

2.实操展示

代码如下(示例):

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class DeZip1 {

    public static void unzipFile(File zipFile, String destDirectory) {
        byte[] buffer = new byte[1024]; //创建缓存区
        try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) {
            ZipEntry zipEntry = zis.getNextEntry(); //开启Zip条目
            while (zipEntry != null) {  //循环读取全部压缩文件
                String fileName = zipEntry.getName();   //获取压缩文件名称
                //创建解压文件   
                File newFile = new File(destDirectory + File.separator + fileName); 
                if (zipEntry.isDirectory()) {   //若条目为文件夹,创建完整的文件夹目录
                    newFile.mkdirs();
                } else {    //若条目为文件
                    //创建解压文件的父目录,确保解压文件目录结构正常
                    new File(newFile.getParent()).mkdirs();
                    //创建文件输入流 
                    try (FileOutputStream fos = new FileOutputStream(newFile)) {    
                        int len;
                        //解压流将数据从压缩包读取,输入流将数据写入解压文件中
                        while ((len = zis.read(buffer)) > 0) {  
                            fos.write(buffer, 0, len);
                            fos.flush();
                        }
                    }
                }
                zipEntry = zis.getNextEntry();
            }
            zis.closeEntry();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        File zipFile = new File("D:/word.zip");
        String destDirectory = "D:/word";
        unzipFile(zipFile, destDirectory);
    }
}

运行结果:

 压缩包中的文件

运行后文件被解压到了指定文件

mkdirs()方法如何获取到文件的路径?

         mkdirs() 方法是 Java 中的一个文件夹创建方法,用于创建一个文件夹以及它的所有父文件夹。该方法会返回一个 boolean 类型的值,表示文件夹是否创建成功。

        mkdirs() 方法获取文件夹路径的方式主要通过传入参数来实现。你可以在方法中传入一个字符串类型的参数,该参数表示文件夹的路径。例如:

File dir = new File("C:\\Users\\username\\Documents\\myFolder");
dir.mkdirs();

        在上述代码中,我们首先创建了一个 File 对象,然后传入一个字符串类型的参数 “C:\Users\username\Documents\myFolder”,表示要创建的文件夹路径。然后调用 mkdirs() 方法创建该文件夹及其父文件夹。

mkdirs()方法具体是如何获取创建多层目录的?

         mkdirs()方法是Java中File类提供的一个方法,用于创建多级目录。

        该方法的实现原理是:在创建指定路径的目录时,如果该目录的上级目录不存在,则会先创建上级目录,再创建指定目录。

具体的实现过程可以简单描述为以下几步:

        1.将传入的路径分割成各级目录名(使用File.separatorChar分割);
        2.从最上级目录开始逐层判断是否存在,如果不存在则创建该目录;
        3.重复步骤2,直到所有目录都创建完成。
例如,假设要创建路径为"/a/b/c/d"的目录,而其中的上级目录"a"、“a/b”、"a/b/c"都不存在,则mkdirs方法会按照以下步骤进行创建:

分割路径,得到目录名数组:[“”, “a”, “b”, “c”, “d”]
判断目录""是否存在,不存在则创建
判断目录"a"是否存在,不存在则创建
判断目录"a/b"是否存在,不存在则创建
判断目录"a/b/c"是否存在,不存在则创建
判断目录"a/b/c/d"是否存在,不存在则创建
这样就完成了整个路径的创建。


总结

        以上就是使用ZipinputStream类解压ZIP文件的介绍,本文仅简单介绍了ZipInputStream流的使用,而ZipInputStream流更多的实战经验仍然需要我们在项目和实践中获取。有拓展或指正的内容欢迎在评论区中留言。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WMS仓储管理系统库存分类的详细讲解

在当今日益复杂和快速变化的商业环境中,仓库管理成为了一个企业不可或缺的关键环节。WMS仓储管理系统解决方案凭借其自动化和信息化的优势,为企业带来了革命性的改变,特别是在库存分类方面。接下来,我们将深入探讨WMS仓储管理系统…

LLMs之GPT4ALL:GPT4ALL的简介、安装和使用方法、案例应用之详细攻略

LLMs之GPT4ALL:GPT4ALL的简介、安装和使用方法、案例应用之详细攻略 目录 GPT4ALL的简介 0、新功能 1、特点 2、功能 3、技术报告 GPT4ALL的安装和使用方法 1、安装 2、使用方法 GPT4ALL的案例应用 LLMs之LLaMA3:基于GPT4ALL框架对LLaMA-3实现…

【笔记】Anaconda命令提示符(Anaconda Prompt)操作

通过anaconda配置python环境有时需要conda安装一些包或者文件,这里作为一个笔记记录如何打开Anaconda命令提示符(Anaconda Prompt),并用conda操作 1.打开Anaconda命令提示符(Anaconda Prompt) 可直接在搜…

如何获得一个Oracle 23ai数据库(RPM安装)

准确的说,是Oracle 23ai Free Developer版,因为企业版目前只在云上(OCI和Azure)和ECC上提供。 方法包括3种,本文介绍第2种: Virtual ApplianceRPM安装Docker RPM安装支持Linux 8和Linux 9。由于官方的Vi…

人工智能|机器学习——强大的 Scikit-learn 可视化让模型说话

一、显示 API 简介 使用 utils.discovery.all_displays 查找可用的 API。 Sklearn 的utils.discovery.all_displays可以让你看到哪些类可以使用。 from sklearn.utils.discovery import all_displays displays all_displays() displays Scikit-learn (sklearn) 总是会在新版本…

Stack数据结构设计模板

第三章 栈、队列、数组 1.栈 1.1 顺序栈 #define MaxSize 20 typedef int ElemType; //顺序栈的定义 typedef struct {ElemType data[MaxSize];int top; }SqStack; // 初始化顺序栈 void InitSqStack(SqStack &S){S.top -1; }; // 入栈(增) bool Push(SqStack &S,El…

推荐5个免费的国内平替版GPT

提起AI,大家第一个想到的就是GPT。 虽然它确实很厉害,但奈何于我们水土不服,使用门槛有些高。 不过随着GPT的爆火,现在AI智能工具已经遍布到各行各业了,随着时间的推移,国内的AI工具也已经“百花盛放”了…

【R语言从0到精通】-4-回归建模

通过之前的文章,我们已经基本掌握了R语言的基本使用方法,那从本次教程开始,我们开始聚焦如何使用R语言进行回归建模。 4.1 回归简介 回归分析是一种统计学方法,用于研究两个或多个变量之间的相互关系和依赖程度。它可以帮助我们了…

Java性能优化(一):Java基础-ArrayList和LinkedList

引言 集合作为一种存储数据的容器,是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型,这些集合类型使用不同的数据结构来实现。因此,不同的集合类型,使用场景也不同。 很多同学在面试的时候&#x…

数控六面钻适用场景-不止家具制造

在快节奏的现代生活中,家具作为我们生活的重要组成部分,其美观度和实用性日益受到人们的关注。而在这背后,一个不可或缺的“工匠”正默默地发挥着它的作用——那就是数控六面钻。 数控六面钻,顾名思义,是一种高度自动…

OS复习笔记ch5-2

引言 在上一篇笔记中,我们介绍到了进程同步和进程互斥,以及用硬件层面上的三种方法分别实现进程互斥。其实,软件层面上也有四种方法,但是这些方法大部分都存在着一些问题: “上锁”与“检查”是非原子操作&#xff0…

error: pathspec ‘XXX‘ did not match any file(s) known to git

使用vscode,在本地开发切换分支时,报以下错误: error: pathspec XXX did not match any file(s) known to git 该问题是由于没有对应分支的原因。 首先使用一下命令,查看本地及远程的所有分支。 git branch -a 若没有对应的分…

47.Redis学习笔记

小林coding -> 图解redis的学习笔记 文章目录 Rediswindwos安装docker安装redis启动redis使用RDM访问虚拟机中的redispython连接redis缓存穿透、击穿、雪崩基本数据类型高级数据类型高并发指标布隆过滤器分布式锁Redis 的有序集合底层为什么要用跳表,而不用平衡…

谷歌推出10门免费AI课程,无需教科书及费用

谷歌面向小白以及开发者分别推出了不同的AI课程~ 包含初级、中级和高级。课程章节大致包括:(含教学视频、参考材料、测验) 基础入门:45分钟深入了解生成式AI 简单实操:30分钟掌握大语言模型 了解如何释放生成式 AI S…

基于小程序实现的投票评选系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…

CSS选择器(基本+复合+伪类)

目录 CSS选择器 基本选择器 标签选择器:使用标签名作为选择器->选中同名标签设置样式 类选择器:给类选择器定义一个名字.类名,并给标签添加class"类名" id选择器:跟类选择器非常相似,给id选择器定义…

数据库数据恢复—SQL Server数据库ndf文件变为0KB的数据恢复案例

SQL Server数据库故障: 存储设备损坏导致存储中SQL Server数据库崩溃。对数据库文件进行恢复后,用户发现有4个ndf文件的大小变为0KB。该SQL Server数据库每10天生成一个大小相同的NDF文件,该SQL Server数据库包含两个LDF文件。 SQL Server数据…

Node.js里面 Path 模块的介绍和使用

Node.js path 模块提供了一些用于处理文件路径的小工具,我们可以通过以下方式引入该模块: var path require("path") 方法描述 序号方法 & 描述1path.normalize(p) 规范化路径,注意.. 和 .。2path.join([path1][, path2][,…

将矩阵按对角线排序(Lc1329)——排序

矩阵对角线 是一条从矩阵最上面行或者最左侧列中的某个元素开始的对角线,沿右下方向一直到矩阵末尾的元素。例如,矩阵 mat 有 6 行 3 列,从 mat[2][0] 开始的 矩阵对角线 将会经过 mat[2][0]、mat[3][1] 和 mat[4][2] 。 给你一个 m * n 的整…

Vue创建todolist

电子书 第三章: https://www.dedao.cn/ebook/reader?idV5R16yPmaYOMqGRAv82jkX4KDe175w7xRQ0rbx6pNgznl9VZPLJQyEBodb89mqoO 没有使用VUE CLI创建项目。 创建步骤: 1, 用Vite 创建项目 2, npm run dev 运行程序 参照之前的文…