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流更多的实战经验仍然需要我们在项目和实践中获取。有拓展或指正的内容欢迎在评论区中留言。

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

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

相关文章

超声波测距传感器--第七天

1.超声波测距 型号:HC-SR04 接线参考:模块除了两个电源引脚外,还有TRIG,ECHO引脚,这两个引脚分别接我们开发板的P1.5和P1.6端 超声波模块是用来测量距离的一种产品,通过发送超声波,利用时间差和声音传播速度,计算模块到前方障碍物的距离。 2. 如何让它发送波: Tri…

简单两步将Lllama、Qwen等开源大模型安装到自己的电脑上

现在已经有非常多优秀的开源大语言模型了,比如Command R、Mistral、Qwen、MiniMax、Baichuan、Phi3等,其中Lllama3和Qwen等已经和GPT4的性能比较接近了。 如果能把这些免费的开源大模型部署到本地电脑或手机上,可以完全自由的使用&#xff0…

电源功率模组: 完整的设计和验证流程解决四个维度的设计挑战

概述 电动汽车、新能源、光伏、风电等领域广泛使用高功率开关电源功率模组。IGBT和MOSFET是模组中常用器件。本文讨论这些技术,以及为实现高达1700伏特电压、1600安培电流、温度稳定和低电磁辐射的复杂指标带来的设计挑战。本文也总结今天的设计方法和优缺点。最后…

有什么内网安全管理软件,内网防护需要哪些安全软件?

随着企业信息化的不断发展,内网安全问题越来越受到企业的关注。内网安全管理防护软件成为了企业保护自身信息安全的重要手段。在市面上,KetuFile、Ping32和NordLocker是备受推崇的三款内网安全管理防护软件。本文将分别介绍这三款软件的特点和优势&#…

使用mxnet中的img2rec.py制作rec数据集

源码链接:mxnet/tools/im2rec.py at master apache/mxnet GitHub 重点关注入参函数即可, def parse_args():"""Defines all arguments.Returns-------args object that contains all the params"""parser argparse.A…

【busybox记录】【shell指令】expand

目录 内容来源: 【GUN】【expand】指令介绍 【busybox】【expand】指令介绍 【linux】【expand】指令介绍 使用示例: 把制表符转化为空格 - 默认输出 把制表符转化为空格 - 修改制表符转空格的个数 把制表符转化为空格 - 修改制表符转空格的个数…

Ubuntu添加网络映射路径

参考资料 linux挂在阿里云盘(webdav协议)给服务器扩容、备份数据等_davfs2-CSDN博客 Linux将WebDAV为本地磁盘 - 夏日冰菓 (lincloud.pro) systemd系统开机运行rc.local_rc-local.service: failed to execute command: exec -CSDN博客 系统版本&#xff…

scikit-learn实现单因子线性回归模型

1.是什么: 针对机器学习提供了数据预处理,分类,回归等常见算法的框架 2.基于scikit-learn求解线性回归的问题: 2.1.求解a,b对新数据进行预测: 2.2评估模型表现(y和y’的方差MSE)…

政安晨【零基础玩转各类开源AI项目】:基于Ubuntu系统本地部署使用GPT-SoVITS进行语音克隆与TTS语音生成

目录 介绍 什么是TTS 安装Miniconda 框架功能 测试通过的环境 开始 1. 安装好miniconda 2. 进入下载的GPT-SoVITS目录 3. 创建虚拟环境并执行脚本 4. 执行过程中可能会出错 5. 下载预训练模型 6. 训练过程中可能会报错 7. 使用过程中可能出错 8.以下是使用全过程…

xv6源码分析 017

xv6源码分析 017 在buffer cache上面的就是logging层了,这一层主要的工作是维持每一个文件系统写入的操作的原子性。什么是原子性?通俗地来讲,原子性可以这样理解,如果一组操作(或者一个操作)在执行的时候…

C语言实现面向对象—以LED驱动为例

点亮一个LED 常见的LED代码 分层分离思想 面向对象的LED驱动 LED左边高电平。 当LED右边为低电平时,LED有电流通过,LED亮。反之,LED灭 GPIO功能描述: 点亮LED的步骤及代码: 开启GPIO的时钟 配置GPIO为输出模式 …

【linux】dmesg工具

dmesg介绍 dmesg工具用途: dmesg - print or control the kernel ring buffer kernel ring buffer, 内核环形缓冲区,也叫环形队列,Linux内核日志就存储在一个环形队列中,环形队列满的时候,新的消息会覆盖掉旧的消息。…

pdf转word,结果为什么是图片?怎么才能转成可编辑的文字?

PDF转Word为何会变成图片?这是许多人在使用文件格式转换工具时经常遇到的问题。为了解答这个疑问,我们需要从多个方面来探讨这个问题。 首先,PDF文件本身的特点是一个重要的因素。PDF,即Portable Document Format,是一…

在ubuntu虚拟机中手动安装VMware Tools(VMware Workstation 17 player)

可参考官方文档:在 Linux 虚拟机中手动安装 VMware Tools 以下列出我在安装过程中遇见的问题: 1、“安装VMware Tools”选项为灰,无法选中 原因是VMware Tools的安装包镜像在Player的安装目录下,需要在虚拟机启动的时候加载这个…

品鉴中的情感交流:如何通过红酒建立深厚的社交联系

品鉴红酒不仅仅是一种感官体验,更是一种情感交流的方式。云仓酒庄雷盛红酒作为一种品质的红酒品牌,能够为人们提供一种与众不同的社交体验,帮助建立深厚的社交联系。 首先,共享品鉴体验是建立社交联系的关键。与朋友、家人或合作伙…

ODOO17数据库安全策略一(ODOO17 Database Security Policy I)

ODOO17作为ERP软件,其核心优势在于数据安全。凭借强大的原生安全机制及灵活的配置,确保数据安全无忧: ODOO17, as an ERP software, boasts its significant advantage in exceptional data security performance. It effectively ensures wo…

Linux最新提权通杀五大绝招(上)

点击星标,即时接收最新推文 本文选自《内网安全攻防:红队之路》 扫描二维码五折购书 Linux 主机权限提升问题是普遍存在的。在Web 服务器、数据库、防火墙、IOT等基础设施中,大部分都运行着Linux 操作系统,鉴于Linux 设备在大量基…

鸿蒙OS NEXT的推出,不仅面向App端

华为官方公布6月份的版本为beta版,依然属于开发者测试版,但可以向普通用户开放了。这点和苹果iOS系统测试形式略微相似:6月份开放首个测试版,随后过渡到公测版,最后再和年度新机一起发布正式版系统。 如果按照这个进度…

git bash退出vim编译模式

解决方法: 1.按esc键(回到命令模式) 此时是没有分号让我们在后面输入命令的 2.按shift键: 3.再输入:wq,并按enter键 此时我们发现又回到git bash窗口 希望对大家有所帮助!

flutter开发实战-GetX响应式状态管理使用

flutter开发实战-GetX响应式状态管理使用 GetX是一个简单的响应式状态管理解决方案。GetX是Flutter的一款超轻、功能强大的解决方案。它将高性能状态管理、智能依赖注入和路由管理快速而实用地结合在一起。这里简单使用一下GetX 一、引入GetX 在工程的pubspec.yaml中引入插件…