压缩文件的解析方式

Java中我们用ZipInputStream和ZipOutputStream来完成对zip文件和rar文件的读写

I /O流:

Input:输入,通过“输入流”进行文件的读取操作

output:输出,通过“输出流”进行文件的写入操作

一、将压缩包解压缩

1.解压缩.zip格式文件:

步骤:

1.根据压缩文件原始路径(字符串),创建源文件对象(File对象)

2.创建根目录对象(File对象),传入源文件的根目录

3.判断根目录,是否已经存在

  •  如果存在,则删除;
  •  如果不存在,则创建根目录。
  • (//rootDir.delete();仅能删除空目录,非空白目录则需使用commons-io包提供的FileUtils工具类进行删除)

4.可以用ZipInputStream对象,进行zip格式的压缩文件

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

5.遍历压缩包中的每个子目录或子文件(ZipEntry类型的对象)

6.创建子目录或子文件(File对象)

7.创建子目录或者子文件

        ①如果zipEntry对象是目录的话,那就创建子目录

        ②如果zipEntry对象是文件的话,那就创建子文件

8.读取当前压缩包的子文件,并通过输出流out写入新子文件中

代码如下:

package com.ztt.Demo01;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Comparator;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;import org.apache.commons.io.FileUtils;import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.rarfile.FileHeader;public class Test02 {public static void main(String[] args) {//String path="D:\\test\\tt1\\easyftp-server-1.7.0.10-cn.zip";String path="D:\\test\\tt1\\实验案例.rar";if(path.endsWith(".zip")) {unzip(path);}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()) {//如果存在,则删除//rootDir.delete();//仅能删除空目录//使用commans-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 file=new File(rootDir.getPath()+"\\"+zipEntry.getName());if(zipEntry.isDirectory()) {//物理磁盘创建子目录file.mkdir();}else {//物理磁盘创建子文件file.createNewFile();//读取当前压缩包中的子文件,并通过输出流out写入新子文件中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 (IOException e1) {e1.printStackTrace();}}
}

2.解压缩rar格式文件:

 步骤:

1.创建源文件对象

2.创建解压缩的根目录对象,

通常是与zip文件在同一目录下,通过用zip的文件的父目录与zip文件的文件名作为数据源,并调用mkdir()方法创建目录。

  • 如果根目录存在的话,就删掉
  • 如果根目录不存在,就创建根目录

3.创建Archive对象,用于读取rar压缩文件格式

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

4.获取压缩文件中的所有子目录或子文件(FileHeader对象)

5.按照子目录(子文件)名称排序

6.遍历子目录和子文件

7.创建子目录或者子文件

  • 遍历结果是目录,那就创建新子目录
  • 遍历结果是文件,那就创建子文件

8.获取压缩包中的自我年间输入流,复制文件输入流至新子文件

代码如下:

package com.ztt.Demo01;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Comparator;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;import org.apache.commons.io.FileUtils;import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.rarfile.FileHeader;public class Test02 {public static void main(String[] args) {//String path="D:\\test\\tt1\\easyftp-server-1.7.0.10-cn.zip";String path="D:\\test\\tt1\\实验案例.rar";if(path.endsWith(".zip")) {unzip(path);}if(path.endsWith(".rar")) {unrar(path);}}//解压缩rar格式public static void unrar(String path) {//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();//创建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) {File f= new File(rootDir.getPath()+"\\"+fd.getFileName());System.out.println(fd.getFileName());if(fd.isDirectory()) {//创建新子目录f.mkdir();}else {//创建新子文件f.createNewFile();//获取压缩包中的子文件输入流InputStream in= archive.getInputStream(fd);//复制文件输入流至新子文件FileUtils.copyToFile(in,f);}}} catch (IOException e1) {e1.printStackTrace();} catch (RarException e) {e.printStackTrace();}}}

       

package com.ztt.Demo01;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class Test03 {public static void main(String[] args) throws IOException {String path1="D:\\test\\tt1\\实验案例\\软件2101软件工程实训作业\\2110024106 范亚丽\\推广订单.pdf";String path2="D:\\test\\tt1\\实验案例\\软件2101软件工程实训作业\\2110024138+赵茹\\2110024138+赵茹+推广订单.pdf";//读取路径1和2对应文件的所有字节数据byte[] bytes1=Files.readAllBytes(Paths.get(path1));byte[] bytes2=Files.readAllBytes(Paths.get(path2));String hash1=hash(bytes1);String hash2=hash(bytes2);System.out.println(hash1);System.out.println(hash2);	}public static String hash(byte[] bytes) {try {MessageDigest md=MessageDigest.getInstance("SHA-512");//传入(更新)原始信息md.update(bytes);//计算哈希值(字节类型)byte[] hashBytes=md.digest();//转换成16进制字符串StringBuilder ret=new StringBuilder();for(byte b:hashBytes) {ret.append(String.format("%02x",b));}return ret.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();return "error";}}
}

二、创建zip压缩文件 

1.压缩文件

步骤:

1.首先创建File对象files引用原始目录

2.然后创建一个ZipOutputStream,传入一个FileOutputStream作为数据源

3.调用listFiles()方法,获取并遍历原始目录下的子文件列表,每次循环创建一个ZipEntry,每写入一个文件前,调用putNextEntry()方法

4.然后将源文件的字节内容,写入zip压缩包

需要注意,每次写完文件,必须调用closeEntry()结束当前ZipEntry。

代码如下: 

package com.ztt.Demo01;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class Test05 {public static void main(String[] args) {//所在目录File dir=new File("D:\\test\\tt1\\壁紙");//获取所有原始子目录File[] files=dir.listFiles();//创建zip压缩文件的输出流try(ZipOutputStream out=new ZipOutputStream(new FileOutputStream(dir.getPath()+"\\"+dir.getName()+".zip"))){//遍历所有原始子文件for(File f:files) {//写入一个压缩包中的子文件(ZipEntry对象)out.putNextEntry(new ZipEntry(f.getName()));//写入字节内容out.write(Files.readAllBytes(f.toPath()));//关闭压缩包中的子文件out.closeEntry();}} catch (IOException e) {e.printStackTrace();}}}

输出结果:

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

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

相关文章

微信小程序毕业设计-汽车维修项目管理系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

NoSQL 之Redis集群模式

一&#xff1a;Redis集群方式 Redis有三种模式&#xff1a;分别是主从复制、哨兵模式、Cluster 1&#xff1a;主从模式: 主从复制是高可用Redis的基础&#xff0c;哨兵和群集都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的…

netscaler LDAP+RADIUS传统的双因素认证方式(之一)

如果使用传统的双因素认证方式&#xff0c;可以通过在Citrix ADC (NetScaler) 13.1上配置Gateway Virtual Server来实现LDAP和RADIUS的双因素认证。当前配置方式&#xff0c;采用Cateway vServer两个Basic Authtication Policy方式实现&#xff0c;以下是详细步骤&#xff1a; …

【码题集】习题

目录 史莱姆融合 松鼠接松果 新月轩就餐 史莱姆融合 根据题意就是一道集合合并的题&#xff0c;所以要用并查集&#xff0c;不过最后我们要输出整个序列&#xff0c;所以要在合并的时候维护一个链表&#xff0c;以便最终合并成一个大集合的时候&#xff0c;输出整个链表就是…

Kotlin Misk Web框架

Kotlin Misk Web框架 1 添加依赖1.1 build.gradle.kts1.2 settings.gradle.kts1.3 gradle.properties 2 请求接口3 程序模块4 主服务类5 测试结果 Misk 是由 Square 公司开发的一个开源的多语言服务器框架&#xff0c;主要用于构建微服务。它主要使用 Kotlin 语言&#xff0c;但…

UGC与AI引领的下一个10年,丝芭传媒已经准备好

丝芭传媒最近传来的消息&#xff0c;都跟技术相关。 基于自研AI大模型“Paro&#xff08;心乐舞河&#xff09;”的AIGPT及AIGC生成工具APP“鹦鹉人”开启用户内测。2023年3月技术测试的图形化智能社交基座“美踏元宇宙”&#xff0c;也将开放首轮用户内测。 此外&#xff0c…

Studying-代码随想录训练营day31| 56.合并区间、738.单调递增的数字、968.监控二叉树、贪心算法总结

第31天&#xff0c;贪心最后一节(ง •_•)ง&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 56.合并区间 738.单调递增的数字 968.监控二叉树 贪心算法总结 56.合并区间 文档讲解&#xff1a;代码随想录合并区间 视频讲解&#xff1a;手撕合并区间 题目&#xf…

高效图纸管理:彩虹图纸管理软件助您一臂之力

高效图纸管理&#xff1a;彩虹图纸管理软件助您一臂之力 在制造业的激烈竞争中&#xff0c;高效图纸管理是企业提升竞争力和降低成本的关键。然而&#xff0c;传统的图纸管理方式往往存在效率低下、信息混乱等问题。此时&#xff0c;彩虹图纸管理软件凭借其卓越的性能和丰富的功…

一个vue页面复用方案

前言 问大家一个问题&#xff0c;曾经的你是否也遇到过&#xff0c;一个项目中有好几个页面长得基本相同&#xff0c;但又差那么一点&#xff0c;想用 vue extends 继承它又不能按需继承html模板部分&#xff0c;恰好 B 页面需要用的 A 页面 80% 的模板&#xff0c;剩下的 20%…

【验收支撑】软件系统验收计划书(直接套用原件doc)

编写软件验收计划是软件开发过程中的一个关键步骤&#xff0c;其重要性体现在以下几个方面&#xff1a; 明确验收标准&#xff1a;软件验收计划详细列出了验收的标准、测试方法、测试环境等&#xff0c;确保所有相关人员对验收的期望和要求有清晰的认识。这有助于避免在验收阶段…

triton需要cuda11.8版本--so 安装个11.8的cuda

1.安装一个11.8的cuda 查看ubunto版本 lsb_release -a查看cpu架构 uname -m到官网得到相应的命令&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 依次输入两条命令。如果没有没有sudo权限就将cuda安装路径修改在自己目录下&#xff1a; sh cuda_11.8.0_520.61.05_li…

论文AIGC率超标?一键降重快速搞定

如何有效降低AIGC论文的重复率&#xff0c;也就是我们说的aigc如何降重&#xff1f;AIGC疑似度过高确实是个比较愁人的问题。如果你用AI帮忙写了论文&#xff0c;就一定要在交稿之前做一下AIGC降重的检查。一般来说&#xff0c;如果论文的AIGC超过30%&#xff0c;很可能会被判定…

【EI征稿】第四届机器人、自动化与智能控制国际会议

【快速通道】 参会方式&#xff1a;担任会议committee成员、组建workshop 、参会报告、参会交流、审稿专家、投稿参会。 会议地点&#xff1a; 湖南 长沙 会议时间&#xff1a;12月6日-9日 会议检索&#xff1a;EI检索 会议官网&#xff1a;https://www.icraic.org/ 投稿链接&a…

华为910b推理Qwen1.5-72b

前情提要&#xff1a;华为910b部署训练推理大模型&#xff0c;本人之前并没有接触过&#xff0c;所以&#xff0c;写此文档进行记录。 &#xff08;注意&#xff1a;版本适配很重要&#xff01;&#xff01;不然就像我一样走了好多坑~~~&#xff09; 首先&#xff0c;看一张图…

大鲸鱼—docker 基本概念及安装使用

目录 一、docker前言 1.什么是Docker&#xff1f; 2.Docker的宗旨 3.容器的优点 4.Docker与虚拟机的区别 5.Docker核心概念 镜像 容器 仓库 6.为什么要用容器 7.容器越来越受欢迎的原因 8.容器在内核中支持2种重要技术 二、Docker安装 三、Docker 镜像操作 1.搜…

旷视AI开源新突破:上传照片即可生成表情包视频!

日前&#xff0c;旷视科技发布了一项新的开源AI人像视频生成框架——MegActor。该框架让用户只需输入一张静态肖像图片和一段视频&#xff08;如演讲、表情包、rap&#xff09;&#xff0c;便可生成一段表情丰富、动作一致的AI人像视频。生成的视频长度取决于输入的视频长度。与…

API接口详解及其在电子商务中的应用研究

目录 引言 一、API接口概述 1.1 API接口定义 1.2 API接口的作用 二、API接口分类 2.1 根据使用对象分类 2.2 根据协议和数据格式分类 三、API接口设计原则 四、API接口在电子商务中的应用 4.1 数据交换与集成 4.2 个性化推荐与营销 4.3 库存管理与订单处理 4.4 数…

C++ 数据结构探索:构建高效程序的基础

C 数据结构探索&#xff1a;构建高效程序的基础 在C编程的广阔领域中&#xff0c;数据结构是理解和实现高效、可维护程序的核心。数据结构是计算机存储、组织数据的方式&#xff0c;它们使得数据访问和修改操作更加高效。本文将带您走进C中几种常见且重要的数据结构&#xff0…

数据湖仓一体(一) 编译hudi

目录 一、大数据组件版本信息 二、数据湖仓架构 三、数据湖仓组件部署规划 四、编译hudi 一、大数据组件版本信息 hudi-0.14.1zookeeper-3.5.7seatunnel-2.3.4kafka_2.12-3.5.2hadoop-3.3.5mysql-5.7.28apache-hive-3.1.3spark-3.3.1flink-1.17.2apache-dolphinscheduler-3.1.9…

气膜仓储与传统仓储的成本优势对比—轻空间

随着物流和仓储需求的不断增长&#xff0c;企业对仓储设施的要求也日益提高。传统仓储设施虽然具有一定的优势&#xff0c;但在建设和运营成本上往往较高。近年来&#xff0c;气膜仓储作为一种新型仓储方式&#xff0c;以其独特的优势逐渐受到市场青睐。轻空间将详细探讨气膜仓…