java中压缩文件的解析方式(解析文件)
背景了解:java中存在IO流的方式,支持我们对文件进行读取(Input,从磁盘到内存)或写入(output,从内存到磁盘),那么我们在面对 “zip”格式或者 “rar” 格式的压缩文件,又如何去解析使用。下面一起学习交流!
所用知识点:1.java的util包下的ZipInputStream : 读取zip文件流
第三方类库: commons-io-2.16.1.jar
junrar-7.5.5.jar
slf4j-api-2.0.13.jar
百度网盘第三方类库下载地址:链接:https://pan.baidu.com/s/1iKPh6HruC70nb8rPn99pRQ?pwd=1111
提取码:1111
1.解析 “zip” 格式的文件
主题思路:首先根据 “zip” 格式的文件的原始路径创建对应的File对象,拿到其根目录,通过exists方法判断根目录是否存在,如果存在就删除重新创建,再读取子内容包括子文件,子目录,分别创建对应的子文件,子目录,并将子文件的内容写入
重点知识点:1.ZipInputStream:用于进行zip格式压缩文件的输入流(读取)
2.zipEntry:用于表示 zip 文件条目。
1.先根据文件的原始路径创建File对象,得到其根目录
getParent():获取其父级路径,
substring(0,sourceFileName.lastIndexOf("."):负责拼接文件的文件名,去掉其 “.zip"后缀
//根据原始路径(字符串),创建源文件(File对象)
//path:文件的原始路径
File sourceFile = new File(path);//根目录
String sourceFileName = sourceFile.getName();
File rootDir = new File(sourceFile.getParent()+"\\"+sourceFileName.substring(0,sourceFileName.lastIndexOf(".")));
2.判断其创建的根目录是否存在,如果存在就删除重新创建
注意:删除时,java自带的delete()方法只能删除空目录,当目录内部用其他子文件时,需使用第三方类库删除
第三方类库的删除方法:导入commons-io-2.16.1.jar,
FileUtils.deleteDirectory(rootDir) : 无论目录是否为空,都可删除,
此方法参数:为要删除的目录文件对象
//判断要创建的目录是否存在if(rootDir.exists()) {//如果存在就删除,重新创建//rootDir.delete();//要求:只能删除空目录//第三方类库删除try {FileUtils.deleteDirectory(rootDir);} catch (IOException e) {e.printStackTrace();}}
3.重新创建新的根目录
//重新创建或创建根目录rootDir.mkdir();
4.读取子内容(子文件,子目录),如果为子目录,就创建,为子文件就创建写入
getNextEntry() : 读取下一个zip文件条目并将该流定位在条目数据的开头。
返回值:下一个zip文件条目,如果没有更多条目,则返回null。
首先呢,上面我们说过了ZipInputStream用于进行zip格式的压缩文件的输入流,我们先用ZipInputStream对zip文件进行读取操作,然后呢遍历其内部的子文件或者子目录,而ZipEntry对象又表示为zip压缩格式文件内部的文件条目。所以我们先创建一个ZipEntry对象,通过getNextEntry()方法,不断用循环获取其文件条目,
再拿到一个文件条目时,创建其对应的File对象,并判断是子文件还是子目录,判断时,用到的一定是zipEntry对象,而不是创建的File对象
如果是子目录,通过mkdir(),创建子目录
如果是子文件,先创建子文件,再通过文件输出流FileOutputStream,写入文件内容。
try (ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile));){//遍历压缩包中的每个子文件或者子目录(ZipEntry类型的对象)ZipEntry zipEntry = null;while((zipEntry = in.getNextEntry()) != null) {System.out.println(zipEntry.getName());//创建子目录或者子文件(file对象)File file = new File(rootDir.getPath()+"\\"+zipEntry.getName());if(zipEntry.isDirectory()) {//物理磁盘创建子目录file.mkdir();}else {//物理磁盘创建子文件file.createNewFile();//此处不能用,用后,会将ZipInputStream创建的流关闭,导致getNextEntry()无法继续使用//FileUtils.copyInputStreamToFile(in, file);//读取内容并写入try(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 (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
2.解析 “rar” 格式的文件:
1.先根据文件的原始路径创建File对象,得到其根目录
2.判断其创建的根目录是否存在,如果存在就删除重新创建
此部分内容与解析 “.zip” 格式压缩文件的内容一致,不再做详细描述
//1.创建解压后的根目录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) {e.printStackTrace();}}//创建根目录rootDir.mkdir();
3.读取 “rar” 格式压缩文件内容:
在读取 “rar” 格式压缩文件时,我们需用到第三方类库:
junrar-7.5.5.jar :用于解析 “rar” 格式的压缩文件
slf4j-api-2.0.13.jar :junrar的jar中某个类依赖此jar包,
首先,我们需要知道在解析“rar” 的jar中,为我们提供了一个类 Archive,用于读取rar压缩文件格式
内部实现逻辑也是通过文件输入流进行读取,,所以内部还是先通过FileInputStream读取,
(1)先通过创建Archive对象,读取rar压缩文件
(2)在读取后,archive并没有提供任何read方法让我们读取,而是依靠
getFileHeader(),让我们获取到所以的子目录或者子文件(但是时FileHeader类型的对象),返回值为一个FileHeader类型的list集合
(3)在获取的list集合,所有的子文件或者子目录的顺序是乱序的,所以我们需要对此list进行排序,用到了sort的选择器,此部分学习参考我帖子的
java接口及其应用场景_java接口的应用场景-CSDN博客
(4)在排序完成后,我们对其遍历,通过创建其对应的File对象,判断是子文件还是子目录
子目录:通过mkdir()方法,创建
如果是子文件,先创建子文件,再通过第三方类库的commons-io-2.16.1.jar,
的 FileUtils.copyInputStreamToFile(in, file); 复制文件输入流至新子文件
//创建Archive对象,用于读取rar压缩文件格式try (Archive archive = new Archive(new FileInputStream(path));){//获取压缩文件中所有的子目录或子文件(FileHeader对象)List<FileHeader> fileHeaders= archive.getFileHeaders();//按照子目录或者子文件名称排序fileHeaders.sort(new Comparator<FileHeader>() {@Overridepublic int compare(FileHeader o1, FileHeader o2) {return o1.getFileName().compareTo(o2.getFileName());}});for(FileHeader fd: fileHeaders) {System.out.println(fd.getFileName());File file = new File(rootDir.getParent()+"\\"+fd.getFileName());if(fd.isDirectory()) {//创建新子文件file.mkdir();}else {//创建新子目录file.createNewFile();//获取压缩包中的子文件流InputStream in = archive.getInputStream(fd);//复制文件输入流至新子文件FileUtils.copyInputStreamToFile(in, file);}}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (RarException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} }
相关文章:
java中压缩文件的解析方式(解析文件)
背景了解:java中存在IO流的方式,支持我们对文件进行读取(Input,从磁盘到内存)或写入(output,从内存到磁盘),那么我们在面对 “zip”格式或者 “rar” 格式的压缩文件&…...

巧用 VScode 网页版 IDE 搭建个人笔记知识库!
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 巧用 VScode 网页版 IDE 搭建个人笔记知识库! 描述:最近自己在腾讯云轻量云服务器中部署了一个使用在线 VScode 搭建部署的个人Markdown在线笔记,考虑到在线 VScode 支持终…...
Jupyter Lab 使用
Jupyter Lab 使用详解 Jupyter Lab 是一个基于 Web 的交互式开发环境,提供了比 Jupyter Notebook 更加灵活和强大的用户界面和功能。以下是使用 Jupyter Lab 的详细指南,包括安装、基本使用、设置根目录和扩展功能等内容。 一、Jupyter Lab 安装与启动…...

MyBatis where标签内嵌foreach标签查询报错‘缺失右括号‘或‘命令未正确结束‘
MyBatis <where>标签内嵌<foreach>标签查询报错’缺失右括号’或’命令未正确结束’ <where>标签内嵌<foreach>标签 截取一段脱敏xml,写明大概意思 <select id"queryLogByIds" resultMap"BaseResultMap">SELE…...

重生奇迹MU 群战王牌
圣导师是重生奇迹MU游戏中八大职业之一,拥有风度翩翩、潇洒自如的形象和神一样的实力。无论是刷怪、PK、打boss还是混战,圣导师都表现出压制其他职业的强大气势。因此,这个职业在游戏中备受欢迎,人气非常高。 实力强大的二代隐藏…...
SpinalHDL之VHDL 和 Verilog 生成
本文作为SpinalHDL学习笔记第十六篇,记录使用SpinalHDL代码生成Verilog/VHDL代码的方法。 SpinalHDL学习笔记总纲链接如下: SpinalHDL 学习笔记_spinalhdl blackbox-CSDN博客 目录: 1.从 SpinalHDL 组件生成 VHDL 和 Verilog 2.生成的 VHD…...

c语言中的字符串函数
strstr函数 函数介绍 strstr 用于在一个字符串中查找另一个字符串的首次出现。 我们来看这个函数的参数名字:haysytack(干草堆)needle(针),这个其实就是外国的一句谚语:在干草堆中找一根针,就…...
[AI 大模型] 百度 文心一言
文章目录 [AI 大模型] 百度 文心一言简介模型架构发展新技术和优势API 代码示例 [AI 大模型] 百度 文心一言 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0DwAIh0T-1720667576892)(https://i-blog.csdnimg.cn/direct/283919e5d78b4951ba1ade5dcfc…...

机器学习开源分子生成系列(2)-基于三维形状和静电相似性的DeepFMPO v3D安装及使用
前言 本文是基于 3D 的分子生成方法DeepFMPO v3D的介绍及安装使用。 一、DeepFMPO v3D是什么? github代码介绍文章 在药物发现中,如何寻找具新颖性和结构多样性的候选分子是颇受药物设计科学家关注的问题。通过虚拟筛选的化学空间搜索往往会受限于筛选…...
机器学习-16-分布式梯度提升库XGBoost的应用
参考XGBoost库 1 XGBoost分布式梯度提升库 XGBoost,全称为eXtreme Gradient Boosting,是一个优化的分布式梯度提升库,旨在高效、灵活且便携。它在Gradient Boosting框架下实现了机器学习算法,并广泛用于分类、回归和排序任务。XGBoost之所以受到广泛欢迎,主要归功于它的…...
视觉/AIGC面经->多模态
1.ocr检测如何做?qwen的文本检测是否合理? paligemma: <loc0110><loc0124><loc0224><loc0389> plate ; <loc0244><loc0130><loc0281><loc0430> plate ; <loc0364><loc0820><loc0403><loc0951> pl…...

<数据集>钢板缺陷检测数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:1986张 标注数量(xml文件个数):1986 标注数量(txt文件个数):1986 标注类别数:7 标注类别名称:[crescent gap, silk spot, water spot, weld line, oil spot, punchin…...
EdgeOne安全能力开箱测评挑战赛
活动地址:EdgeOne安全能力开箱测评挑战赛-腾讯云开发者社区-腾讯云 随着网络攻击日益频繁,企业网站面临着数据泄露、DDoS攻击、CC攻击等多种安全威胁。如何有效保护企业网站安全,成为企业IT部门的重要任务。腾讯云EdgeOne作为一款集成了CDN和…...

神经网络识别数字图像案例
学习资料:从零设计并训练一个神经网络,你就能真正理解它了_哔哩哔哩_bilibili 这个视频讲得相当清楚。本文是学习笔记,不是原创,图都是从视频上截图的。 1. 神经网络 2. 案例说明 具体来说,设计一个三层的神经网络。…...

c++包管理器
conan conan search,查看网络库 conan profile detect,生成缓存信息conan new cmake_exe/cmake_lib,创建cmakelists.txtconan install .,执行Conanfile.txt中的配置,生成相关的bat文件 项目中配置Conanfile.txt(或者…...

监控易V7.6.6.15升级详解7,日志分析更高效
随着企业IT系统的日益复杂,日志管理成为了保障系统稳定运行、快速定位问题的重要工具。为了满足广大用户对日志管理功能的更高需求,监控易系统近日完成了重要版本升级,对日志管理功能进行了全面优化和新增。 一、Syslog日志与SnmpTrap日志统…...

HTML表格、表单标签
目录 一、表格 (1)关于表格中标签说明 (2)关于表格中属性说明 (3)简单操作演示 (4)表格小结 二、表单 (1)简单操作演示 (2)注…...

(Windows环境)FFMPEG编译,包含编译x264以及x265
本文使用 MSYS2 来编译 ffmpeg 一、安装MSYS2 MSYS2 是 Windows 下的一组编译套件,它可以在 Windows 系统中模拟 Linux 下的编译环境,如使用 shell 运行命令、使用 pacman 安装软件包、使用 gcc (MinGW) 编译代码等。 MSYS2 的安装也非常省心&#x…...

notepad++中文出现异体汉字,怎么改正
notepad显示异体字,如何恢复? 比如 “门” 和 “直接” 的"直"字,显示成了 方法 修改字体, 菜单栏选择 Settings(设置),Style Configurator…(语言格式设置…)…...

EasyAnimate-v3版本支持I2V及超长视频生成
阿里云人工智能平台(PAI)自研开源的视频生成项目EasyAnimate正式发布v3版本: 支持 图片(可配合文字) 生成视频 支持 上传两张图片作为起止画面 生成视频 最大支持720p(960*960分辨率) 144帧视…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...

恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...