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帧视…...
83、CAN FD物理层核心差异:更高速率与更灵活的位时序
CAN FD物理层核心差异:更高速率与更灵活的位时序 从一次现场总线崩溃说起 去年在给某新能源车企做BMS(电池管理系统)升级时,遇到一个让我熬夜到凌晨三点的怪问题。传统CAN总线跑500kbps,整车十几个节点通信稳如老狗。客户要求把电池包内部的状态数据(单体电压、温度、S…...
【Claude学术写作辅助应用】:教育部新文科AI赋能白皮书唯一推荐工具,附12所双一流高校实证数据
更多请点击: https://intelliparadigm.com 第一章:Claude学术写作辅助应用的政策定位与战略价值 Claude作为新一代大语言模型,在学术写作辅助领域已超越工具属性,成为支撑国家科研诚信建设、高等教育数字化转型与国际学术话语权提…...
大模型训练全流程拆解:7个阶段+12个关键参数,新手也能看懂
大模型训练全流程拆解:7个阶段+12个关键参数,新手也能看懂 副标题: 从0到1构建大模型的完整路径,附实战避坑指南 一、痛点:为什么大模型训练这么复杂? 很多开发者第一次接触大模型训练时,会被各种术语绕晕:预训练、SFT、RLHF、DPO、LoRA… 感觉像在看天书。 更糟糕的…...
显卡驱动彻底清理解决方案:Display Driver Uninstaller专业使用指南
显卡驱动彻底清理解决方案:Display Driver Uninstaller专业使用指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers…...
对比体验使用Taotoken聚合接口与直连原厂API的延迟与稳定性差异
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比体验使用Taotoken聚合接口与直连原厂API的延迟与稳定性差异 1. 引言 在集成大模型能力到实际业务时,开发者除了关…...
从Java全栈开发到云原生:一次真实的面试对话与技术剖析
从Java全栈开发到云原生:一次真实的面试对话与技术剖析 面试场景回顾 在一次真实的互联网大厂Java全栈开发岗位的面试中,面试官和应聘者展开了一场围绕技术栈、项目经验和系统设计的深入交流。面试官以专业严谨的态度,逐步引导应聘者展示其技…...
Unity C#方法设计实战:从参数传递到跨脚本调用
1. 这不是语法课,是写代码时每天要面对的“沟通现场”刚带完一批Unity新手做小项目,有个现象特别明显:很多人能背出“方法就是函数”“参数分值传递和引用传递”,但一到实际写代码就卡壳——比如想让角色跳跃时播放音效࿰…...
游戏模组革命:BepInEx框架让每个玩家都能打造个性化游戏体验
游戏模组革命:BepInEx框架让每个玩家都能打造个性化游戏体验 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 想要为心爱的游戏添加新功能、修改游戏机制,或…...
AI Agent培训如何撬动企业人效革命:3个已验证的行业应用范式与5步落地法
更多请点击: https://intelliparadigm.com 第一章:AI Agent培训如何撬动企业人效革命:3个已验证的行业应用范式与5步落地法 AI Agent并非通用智能体,而是经领域知识注入、任务流程对齐与反馈闭环训练后具备自主决策边界的“数字员…...
中国开源大模型工程化实践:从数据治理到企业落地
1. 项目概述:一场被误读为“军备竞赛”的开源模型战略博弈“TAI #159”这个编号本身就像一个行业内部的暗号——它指向的不是某款具体产品,而是一期深度技术简报的核心议题:当全球AI格局进入新阶段,中国开源大模型生态的系统性突围…...
