Zip压缩文件的操作

ZipInputStreamhe和ZipOutputStream这两个类本身不具备读写文件的能力,这两个类都间接继承自Filter Input Stream,因此它们的构造方法允许传入一个真正具备读写功能的字符流对象。如FileInputStream和FileOutputStream的对象,从尾完成文件的读写。

        首先创建一个zipInputStream的对象,zip文件中的每一个文件都是一个ZipEntry对象,通过zipInputStream对象调用getNextEntry()方法获取这些文件到输入流中。然后通过输入流和输出流完成文件的读写。

读取Zip包(解压缩)
首先要创建解压缩目录sourceDir,通常是与zip文件在同一个目录下,通过用zip文件的父目录与zip文件的文件名作为数据源,并调用mkdir()方法创建目录。

第二步就是解析并读取zip压缩文件,创建一个ZipInputStream,传入一个FileInputStream作为数据源,然后循环调用getNextEntry(),遍历zip文件每个子文件,每次循环获取子文件的文件名并创建该文件的输出流,调用write()方法,读取文件内容并写入输出流。

public class Test02 {public static void main(String[] args) {// String path = "D:\\1\\文件夹\\easyftp-server-1.7.0.10-cn.zip";String path = "D:\\1\\文件夹\\实验案例.rar";if (path.endsWith("zip")) {unzip(path);} else if (path.endsWith("rar")) {unrar(path);}}// 解压缩zip格式public static void unzip(String path) {// 根据原始路径(字符串),创建源文件(File对象)File sourceFile = new File(path);// 根目录String sourceFilename = sourceFile.getName();File rootDir = new File(sourceFile.getParent() + "\\" + sourceFilename.substring(0, sourceFilename.lastIndexOf(".")));// 判断根目录是否存在if (rootDir.exists()) {// 如果存在,则删除// 使用commons-io包提供的FileUtils工具类进行删除try {FileUtils.deleteDirectory(rootDir);} catch (IOException e) {e.printStackTrace();}}// 创建根目录rootDir.mkdir();// ZipInputstream :用于进行zip格式的压缩文件输入流try (ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile))) {// 遍历压缩包中的每个子目录或子文件(ZipEntry类型的对象)ZipEntry zipEntry = null;while ((zipEntry = in.getNextEntry()) != null) {File file = new File(rootDir.getPath() + "\\" + zipEntry.getName());System.out.println(zipEntry.getName());if (zipEntry.isDirectory()) {// 子目录file.mkdir();} else {// 物理磁盘创建文件file.createNewFile();// 读取当前压缩包中的子文件,并通过输出流out写入子文件中FileOutputStream out = new FileOutputStream(file);byte[] buff = new byte[1024];int len = -1;while ((len = in.read(buff)) != -1) {out.write(buff, 0, len);}}}} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}// 解压缩rar格式public static void unrar(String path) {// 1.创建压缩rar格式File rarFile = new File(path);File rootDir = new File(rarFile.getParent() + "\\" + rarFile.getName().substring(0, rarFile.getName().lastIndexOf(".")));if (rootDir.exists()) {try {FileUtils.deleteDirectory(rootDir);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}rootDir.mkdir();// 创建Archive 对象,用于读取rar压缩文件格式try (Archive archive = new Archive(new FileInputStream(path))) {// 获取压缩文件中的所有子目录或子文件(FIleHeader对象)List<FileHeader> fileheaderList = archive.getFileHeaders();// 按照子目录(子文件)名称排序fileheaderList.sort(new Comparator<FileHeader>() {@Overridepublic int compare(FileHeader o1, FileHeader o2) {return o1.getFileName().compareTo(o2.getFileName());}});// 遍历子目录和子文件for (FileHeader fd : fileheaderList) {System.out.println(fd.getFileName());File f = new File(rootDir.getPath() + "\\" + fd.getFileName());if (fd.isDirectory()) {// 创建新的子目录f.mkdir();} else {// 创建新的子文件f.createNewFile();// 获取压缩包中的子文件输入流InputStream in = archive.getInputStream(fd);// 复制文件输入流至新子文件FileUtils.copyInputStreamToFile(in, f);}}} catch (RarException | IOException e) {// TODO: handle exceptione.printStackTrace();}}}

写入zip包(压缩)

首先创建File对象files引用原始目录,然后创建一个ZipOutputStream,传入一FileOutputStream作为数据源,调用listFiles()方法,获取并遍历原始目录下的子文件列表,每次循环创建一个ZipEntry,每写入一个文件前,调用putNextEntry()方法,然后将原文件的字节内容,写入zip压缩包,需要注意,每次写完文件,必须调用closeEntry()结束当前ZipEntry。


public class Test05 {public static void main(String[] args) {//所在目录File dir=new File("D:\\1\\图片");//获取所有的原始文件File[] files=dir.listFiles();//创建zip压缩文件的输出流try(ZipOutputStream out=new ZipOutputStream(new FileOutputStream(dir.getPath()+"\\"+".zip"))){//遍历所有的原始文件for(File f:files) {//写入一个压缩包中的子文件(ZipEntry对象)out.putNextEntry(new ZipEntry(f.getName()));//写入字节内容out.write(Files.readAllBytes(f.toPath()));//关闭压缩包中的子文件out.closeEntry();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

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

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

相关文章

数据赋能(145)——开发:数据拆分——实施过程、应用特点

实施过程 数据拆分的实施过程通常涉及以下几个关键步骤&#xff1a; 确定拆分目标和需求&#xff1a; 明确数据拆分的目的和需求&#xff0c;例如是为了减少数据处理的复杂性、提高查询效率还是为了满足特定的业务需求。根据需求确定拆分后的数据结构和拆分规则。选择拆分方法…

合宙 Air780E模块 AT 指令 MQTT连接

固件说明 重启模块 //tx ATRESET//rx ATRESETOK ^boot.romv!\n RDY^MODE: 17,17E_UTRAN ServiceCGEV: ME PDN ACT 1NITZ: 2024/07/10,08:33:440,0查询模块版本信息 //tx ATCGMR//rx ATCGMRCGMR: "AirM2M_780E_V1161_LTE_AT"OK基本流程 4G模块支持MQTT和MQTT SSl协…

【LeetCode】存在重复元素 II

目录 一、题目二、解法完整代码 一、题目 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…

如何安装和管理RabbitMQ

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 将事情推迟一段时间而不是立即去做&#xff0c;可能被认为是懒惰的。事实上&#xff0c;大多数情况下可能确实如此。然而&#xff…

顶顶通呼叫中心中间件-私有化asrproxy配置热词模型

顶顶通呼叫中心中间件-私有化asrproxy配置热词模型 1、配置热词文件 将热词存在一个txt文件中&#xff0c;比如&#xff1a;hotword.txttxt文本里面写热词&#xff0c;一个热词一行&#xff0c;用utf8编码把热词文件上传到asrproxy程序目录中&#xff0c;路径&#xff1a;/dd…

音视频入门基础:H.264专题(12)——FFmpeg源码中通过SPS属性计算视频分辨率的实现

一、引言 在上一节《音视频入门基础&#xff1a;H.264专题&#xff08;11&#xff09;——计算视频分辨率的公式》中&#xff0c;讲述了通过SPS中的属性计算H.264编码的视频的分辨率的公式。本文讲解FFmpeg源码中计算视频分辨率的实现。 二、FFmpeg源码中计算视频分辨率的实现…

读人工智能全传10深度思维

1. 深度思维 1.1. DeepMind 1.1.1. 深度思维 1.1.2. 2014年的员工不足25人 1.1.3. 深度思维公司公开宣称其任务是解决智能问题 1.1.4. 2014年谷歌收购DeepMind&#xff0c;人工智能突然成了新闻热点&#xff0c;以及商业热点 1.1.4.1. 收购报价高达4亿英镑 1.1.4.2. 深度…

头歌资源库(26)方格填数

一、 问题描述 二、算法思想 这是一个排列组合问题。我们可以使用动态规划的思想来求解。 假设dp[i]表示填入前i个位置的数字的方案数。考虑第i个位置&#xff0c;它有9种填法&#xff08;0~9减去前一个位置上的数字&#xff09;&#xff0c;则有dp[i] 9 * dp[i-1]。由于第…

ArduPilot开源飞控之AP_Mount_Backend

ArduPilot开源飞控之AP_Mount_Backend 1. 源由2. 框架设计2.1 类构造函数2.2 公共方法2.2.1 重要方法2.2.2 运动能力&#xff08;需要在子类中重写&#xff09;2.2.3 模式处理2.2.4 目标处理2.2.5 命令处理2.2.6 消息传递和状态2.2.7 回调函数2.2.8 相机控制2.2.9 测距仪 2.3 保…

samout 结构再优化 收敛速度再加快

代码 import torch import numpy as npclass MaxState(torch.nn.Module):def __init__(self, hidden_dim, heads, win):super(MaxState, self).__init__()assert hidden_dim % heads 0, "Hidden size must be divisible by the number of heads."self.head_size h…

基于python实现并编译提升cpu与内存使用率的脚本

在服务器运维过程中&#xff0c;有很多公司会对服务器的资源使用率进行监测&#xff0c;发现使用率不高了&#xff0c;会对服务器降配。如果你是乙方&#xff0c;你可以尝试一下这种方法&#xff0c;脚本提升cpu与内存的使用率。如果你需要对服务器性能或者服务稳定性进行测试&…

Redis 布隆过滤器性能对比分析

redis 实现布隆过滤器实现方法&#xff1a; 1、redis 的 setbit 和 getbit 特点&#xff1a;对于某个bit 设置0或1&#xff0c;对于大量的值需要存储&#xff0c;非常节省空间&#xff0c;查询速度极快&#xff0c;但是不能查询整个key所有的bit&#xff0c;在一次请求有大量…

240711_昇思学习打卡-Day23-LSTM+CRF序列标注(2)

240711_昇思学习打卡-Day23-LSTMCRF序列标注&#xff08;2&#xff09; 今天记录LSTMCRF序列标注的第二部分。仅作简单记录 Score计算 首先计算正确标签序列所对应的得分&#xff0c;这里需要注意&#xff0c;除了转移概率矩阵&#x1d40f;外&#xff0c;还需要维护两个大小…

担心插座预留的不够用,家里装修留多少开关插座

全屋插座布局,防漏防后悔      家里装修留多少开关插座?留多了费钱      留少了还不够用,给大家整理了全屋开关插座的布局      1,入户门留5个,门外给监控器1个      门旁边给卧室,走廊,客厅,中央空调各留1个      2,客厅留10个,电视留4-5个, 沙发两边各1…

html5——CSS基础选择器

目录 标签选择器 类选择器 id选择器 三种选择器优先级 标签指定式选择器 包含选择器 群组选择器 通配符选择器 Emmet语法&#xff08;扩展补充&#xff09; 标签选择器 HTML标签作为标签选择器的名称&#xff1a; <h1>…<h6>、<p>、<img/> 语…

如何做好漏洞扫描工作提高网络安全

在数字化浪潮席卷全球的今天&#xff0c;企业数字化转型已成为提升竞争力、实现可持续发展的关键路径。然而&#xff0c;这一转型过程并非坦途&#xff0c;其中网络安全问题如同暗礁般潜伏&#xff0c;稍有不慎便可能引发数据泄露、服务中断乃至品牌信誉受损等严重后果。因此&a…

edge 学习工具包 math solver

简介 推荐微软推出的学习工具中的两项工具&#xff1a;数学求解器和 pdf 阅读器。 打开 edge 学习工具包的方法 &#xff1a;右上角三点-更多工具-学习工具包。 math solver 除了基础的计算求解外&#xff0c;还用图标展示公式&#xff0c;清晰直观。 地址&#xff1a;求解…

CentOS7使用yum命令报错

目录结构 前言使用yum命令&#xff0c;报错信息问题排查解决方案参考文章 前言 安装CentOS 7 虚拟机&#xff0c;使用yum命令报错&#xff0c;调查整理如下&#xff1a; 使用yum命令&#xff0c;报错信息 [rootlocalhost ~]# sudo yum install net-tools 已加载插件&#xff…

OPenCV实现直方图均衡化----20240711

# 直方图均衡化import cv2 import numpy as np import matplotlib.pyplot as plt# 读取彩色图像 img = cv2.imread("./pictures/Lena.jpg")# 检查图像是否加载成功 if img is None:print("Could not open or find the i

每天五分钟深度学习:向量化技术在神经网络中的应用

本文重点 向量化技术,简而言之,就是利用矩阵运算(而非传统的for循环)来执行大规模的计算任务。这种技术依赖于单指令多数据(SIMD)架构,允许一个指令同时对多个数据元素执行相同的操作。例如,在向量化加法中,不再需要逐个元素进行加法操作,而是可以一次性对整个向量执…