压缩文件的解析方式

news2024/9/25 17:14:58

        我们常用的压缩文件有两种:后缀为.zip或者.rar,接下来将介绍解析两种压缩文件的代码。需要用到三个jar包:commons-io-2.16.1.jar、junrar-7.5.5.jar、slf4j-api-2.0.13.jar,可以在官网下载,也可以发私信。

        这段代码是一个Java程序,包含了一个main方法和一个unzip方法。在main方法中,通过传入一个文件路径(path),判断该文件是以.zip结尾还是其他类型的文件,并根据不同的情况调用unzip方法或unrar方法进行解压缩。

1、后缀为.zip的压缩文件

   unzip方法主要实现了解压缩zip格式文件的功能。它首先根据传入的文件路径创建一个File对象,然后根据该文件对象获取根目录的路径,并判断根目录是否已经存在,如果存在则删除该目录(使用FileUtils工具类删除)。接着创建根目录,并使用ZipInputStream来读取压缩文件中的内容,遍历每个子目录或子文件(ZipEntry对象),然后根据每个子目录或子文件创建相应的File对象,并在物理磁盘上创建子目录或文件,最后将压缩文件中的内容写入到新创建的子文件中。

        需要注意的是,该代码使用了FileUtilsZipInputStream来处理文件和解压缩操作,同时捕获了可能抛出的IOException异常并进行了处理。

public class Demo {
    public static void main(String[] args) {
        String path="D:\\Ayjy\\001\\easyftp-server-1.7.0.10-cn.zip";
        if (path.endsWith(".zip")) {
            unzip(path);
        } else {
            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();  //仅能删除空目录

            //使用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 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 e) {
            e.printStackTrace();
        }
    }

此处必须为-1

因为当文件读取完成时,会出现以下结果:

2、后缀为.rar的压缩文件

        unrar()方法和unzip()方法一起写在Demo类中

        unrar()方法实现了解压缩rar格式文件的功能。首先根据传入的文件路径创建一个File对象表示待解压缩的rar文件,并通过该文件对象获取根目录的路径。如果根目录已经存在,则使用FileUtils工具类删除该目录;接着创建新的根目录。

        然后通过创建Archive对象,使用FileInputStream读取rar压缩文件格式。通过getFileHeaders()方法获取压缩文件中的所有子目录或子文件(FileHeader对象),并将其按照名称排序。接着遍历子目录和子文件,创建新的子目录或文件,并将压缩文件中的内容写入新创建的子文件中。

        在处理异常时,捕获了可能抛出的FileNotFoundExceptionRarExceptionIOException异常,并进行相应的处理。这段代码主要使用了Archive类来读取rar文件内容,以及FileUtils类来处理文件操作。

//解压缩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().indexOf(".")));
        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>() {
                @Override
                public int compare(FileHeader o1, FileHeader o2) {
                    return o1.getFileName().compareTo(o2.getFileName());
                }
            });

            //遍历子目录和子文件
            for(FileHeader fd: fileHeaderList){
                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 (FileNotFoundException e) {
            e.printStackTrace();
        } catch (RarException | IOException e) {
            e.printStackTrace();
        }
    }

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

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

相关文章

2.GAP:通用访问协议

GAP的简单理解 GAP这个名字&#xff0c;直接翻译过来不好理解。 简单点可以理解为&#xff1a; 这是蓝牙设备在互联之前&#xff0c;过程中&#xff0c;第一个用于交流的协议。在代码上&#xff0c;会给这个协议实现&#xff0c;连接参数的设置&#xff0c;连接事件的实现&am…

【算法】二叉树-迭代法实现前后中序遍历

递归的实现就是:每一次递归调用都会把函数的局部变量&#xff0c;参数值和返回地址等压入调用栈中&#xff0c;然后递归返回的时候&#xff0c;从栈顶弹出上一次递归的各项参数&#xff0c;这就是递归为什么可以返回上一层位置的原因 可以用栈实现二叉树的前中后序遍历 1. 前序…

【数学趣】拉窗帘模型之求面积引发的6个解法

抖音上推了一个趣题 题 求橙色部分的面积 蓝色部分是2个正方形。大的正方形边长为6。&#xff08;小的正方形一半被一个黄色三角形遮住了一半&#xff09; 答案 18 解法1&#xff1a;拉窗帘 先写一个代号&#xff0c;方便证明&#xff0c;H G 代表正方形。&#xff08;G…

AV1 编码标准中帧内预测技术详细说明

AV1 编码标准帧内预测 AV1&#xff08;AOMedia Video 1&#xff09;是一种开源的视频编码格式&#xff0c;旨在提供比现有标准更高的压缩效率和更好的视频质量。在帧内预测方面&#xff0c;AV1相较于其前身VP9和其他编解码标准&#xff0c;如H.264/AVC和H.265/HEVC&#xff0c;…

暑假第一次作业

第一步&#xff1a;给R1,R2,R3,R4配IP [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24 [R1-Serial4/0/0]ip address 15.0.0.1 24 [R2-GigabitEthernet0/0/0]ip address 192.168.2.1 24 [R2-Serial4/0/0]ip address 25.0.0.1 24 [R3-GigabitEthernet0/0/0]ip address 192.…

【Mutilism用74ls192和与非门设计3进制24进制加法计数器2荔枝】2022-5-10

缘由【数电 数字逻辑】如何用74ls192和与非门设计任意进制加法计数器&#xff1f;-嵌入式-CSDN问答

Qt学生管理系统(付源码)

Qt学生管理系统 一、前言1.1 项目介绍1.2 项目目标 2、需求说明2.1 功能性说明2.2 非功能性说明 三、UX设计3.1 登录界面3.2 学生数据展示3.3 信息插入和更新 三、架构说明3.1 客户端结构如下3.2 数据流程图3.2.1 数据管理3.2.2 管理员登录 四、 设计说明3.1 数据库设计3.2 结构…

基于Python+Flask+MySQL的新冠疫情可视化系统

基于PythonFlaskMySQL的新冠疫情可视化系统 FlaskMySQL 基于PythonFlaskMySQL的新冠疫情可视化系统 项目主要依赖前端&#xff1a;layui&#xff0c;Echart&#xff0c;后端主要是Flask&#xff0c;系统的主要支持登录注册&#xff0c;Ecahrt构建可视化图&#xff0c;可更换主…

Qt 统计图编程

学习目标&#xff1a;Qt 折线图&#xff0c;柱形图和扇形统计图编程 学习基础 Qt QChart 曲线图表操作-CSDN博客 学习内容 Qt中绘制三种常见的图表非常方便, 主要步骤如下: 1. 折线图: - 使用QLineSeries定义折线数据,添加多个坐标点 - 使用QValueAxis创建X轴和Y轴 - 将…

数据结构——查找算法

文章目录 1. 查找算法 2. 顺序查找 2. 二分查找 1. 查找算法 查找算法是用于在数据集中定位特定元素的位置的算法。查找是计算机科学中一项基本操作&#xff0c;几乎在所有应用程序中都需要使用。例如&#xff0c;数据库查询、信息检索、字典查找等都涉及到查找操作。查找算…

【Mutilism数字电路实现32进制5线32译码器】2022-5-7

缘由3-8译码器到74HC138-编程语言-CSDN问答 2片16004非门2个组成8进制和4进制实现。 按138逻辑表把E3也接入置零&#xff0c;同时把E1也接入反向使得切换时138保持高电平输出&#xff0c;就看不到转换时第一个出现短暂低电平&#xff0c;是最完美的解决方案&#xff0c;二级反向…

分布式I/O从站的认知

为什么需要分布式I/O从站&#xff1f; 当PLC与控制机构距离过远时&#xff0c;远距离会带来信号干扰&#xff0c;分布式I/O从站只需要一个网络线缆连接。 ET200分布式I/O从站家族 体积紧凑、功能强大。 ET200SP ET200M ET200S ET200iSP ET200 AL ET200pro ET200 eco PN 通讯协议…

yarn底层原理详解:(第33天)

系列文章目录 一、yarn总体架构 二、yarn核心组件及功能 三、yarn资源分配与调度 四、yarn提交和执行流程 五、yarn调度算法 六、yarn安全性与容错性 文章目录 系列文章目录前言一、总体架构二、核心组件及功能1. ResourceManager&#xff08;RM&#xff09;2. NodeManager&am…

达梦数据库dm8安装步骤及迁移

目录 前言: 一、安装部署 1、下载 2、创建用户及安装目录 3、挂载下载的镜像 4、环境配置 5、安装 二、基本使用 1、DM工具使用 2、兼容性配置 2.1 兼容GBK字符集编码 2.2 兼容UTF-8字符集编码 3、创建用户和密码,表空间 4、整理数据库配置 5、启动脚本设置 …

13、Python之函数:简单的参数默认值其实并不简单

目录 引言 日志打印的问题 返回参数默认值的问题 问题产生的原因 关于参数默认值的最佳实践 总结 引言 在前一篇关于Python函数的文章中&#xff0c;我们介绍了函数的基本使用、函数的默认参数、lambda函数的用法&#xff0c;相当于对Python中的函数有了一个入门的介绍。…

动态规划之数字三角形模型+最长上升子序列模型

首先&#xff0c;我们从集合角度重新看待DP&#xff1a; 直接看题&#xff1a;https://www.acwing.com/problem/content/1029/ 就是取纸条的原题&#xff0c;我们令f[i1,j1,i2,j2]表示从(1,1),(1,1)分别走到(i1,j1),(i2,j2)的路径的max i1j1i2j2&#xff0c;于是我们可以把状…

ESP32的芯片有几种

ESP32系列 ESP32芯片截止到24年7月有5个系列&#xff1a; ESP32-C3 ESP32由ESP32-P 系列、ESP32-S 系列、ESP32-C 系列、ESP32-H 系列、ESP32 系列构成。其中ESP32-S分为S3和S2两个小系列&#xff1b;ESP32-C系列分为C6、C5、C3、C2四个小系列&#xff0c;具体如下。 说明&am…

合宙 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协…

5 MySql

5 MySql 一、简介二、SQL语言2.1 导入外部SQL文件2.2 显示表结构2.3 与创建数据库相关的语句2.4 与表相关的语句2.5 操作表中的数据2.6 7种基本的sql查询 三、SQL的注意点3.1 与集合函数相关3.2 SQL语句的书写与执行过程 四、约束 constraint4.1 作用4.2 功能分类4.3 自增 五、…

读人工智能全传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. 深度…