首页 > 其他分享 >压缩文件的解析方式

压缩文件的解析方式

时间:2024-07-11 19:57:05浏览次数:15  
标签:文件 方式 子目录 压缩文件 rootDir File new 解析

        我们常用的压缩文件有两种:后缀为.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();
        }
    }

标签:文件,方式,子目录,压缩文件,rootDir,File,new,解析
From: https://blog.csdn.net/m0_65347933/article/details/140358749

相关文章

  • 解读中国第三方医学诊断:行业现状与发展趋势深度解析
    一、行业简述第三方医学诊断(IndependentClinicalLaboratory,简称ICL)是指独立于医疗机构之外,为各级医院、社区卫生服务中心、乡镇卫生院、体检中心、疾控中心等提供的医学诊断检测服务。第三方医学诊断服务机构,即独立医学实验室,作为医疗服务体系的重要补充,通过专业的技术和设......
  • 使用Java IO进行压缩文件的解析方式
    JavaIO库提供了对ZIP解压缩的支持,主要通过java.util.zip包中的类来实现。ZipEntry:表示ZIP文件中的一个条目,可以是文件或目录。ZipInputStream:用于进行zip格式的压缩文件输入流。ZipOutputStream:用于进行zip格式的压缩文件输出流。对ZIP格式的文件进行解压      ......
  • 如何处理压缩文件de方式总结!!!
    目录1.Java标准库中的压缩相关API2.解压缩过程3.第三方库4.使用第三方库的步骤5.参考代码1.Java标准库中的压缩相关APIJava的标准库java.util.zip提供了处理ZIP和GZIP格式压缩文件的功能。这个包包含以下主要类:(1)ZipFile:用于读取ZIP文件的元数据,如文件列表和注......
  • 深入解析Spring Boot的application.yml配置文件
    目录引言SpringBoot配置文件简介application.yml的优点基本结构与语法YAML语法基础SpringBoot中application.yml的基本结构常见配置项详解服务器配置数据源配置日志配置其他常见配置环境配置与Profile多环境配置激活Profile高级配置与技巧属性的占位符替换自定......
  • Spring MVC 全面指南:从入门到精通的详细解析
    引言:SpringMVC,作为Spring框架的一个重要模块,为构建Web应用提供了强大的功能和灵活性。无论是初学者还是有一定经验的开发者,掌握SpringMVC都将显著提升你的Web开发技能。本文旨在为初学者提供一个全面且易于理解的学习路径,通过详细的知识点分析和实际案例,帮助你快速上手Sprin......
  • 一文解析:如何提高IP纯净度?
    IP的“清白度”,简而言之,是指一个IP地址在网络环境中的清洁与可信度水平。它反映了该IP地址是否涉及非法活动、是否被滥用,以及是否因频繁异常行为而被网络服务提供商、防火墙或安全系统视为可疑。一个高“清白度”的IP地址,如同网络空间中的一位信誉卓越的公民,能够享受更加自由、......
  • 权限类漏洞解析——功能权限篇
    上一篇【一文理解权限类漏洞产生的原因之未授权篇】有讲过未授权漏洞产生的原因,但是在我实际的挖洞过程中,其实遇见很少,我有印象的好像只有几个非核心站点的中危。但是对于另一类权限漏洞,功能及数据权限相关的漏洞就不一样了,我挖的逻辑漏洞中,大部分来源于它们,从中危到严重,危害......
  • Windows 桌面改造小技巧 · 一键去除快捷方式小箭头和小盾牌
    Windows的桌面上,总会有一些不如意的小地方,比如快捷方式上的小箭头和小盾牌图标:标志挡住了应用图标,显得很难受这些角标作用如下:快捷方式角标是用来提示你这是一个快捷方式的,其实这个角标还好,可以保留小盾牌,如果开启UAC的话,有盾牌就表示这个应用会触发这个安全保护,其作用并......
  • HAL库源码移植解析与使用之捕获
    而且函数HAL__TIM_IRQHANDLER()函数里面也是放置了判断所有tim中会产生中断的标志位,然后执行该中断的回调函数callback并清除标志位#include"./BSP/TIMER/gtim.h"TIM_HandleTypeDefg_timx_cap_chy_handle;/*定时器x句柄*//*通用定时器通道y输入捕获初始化函......
  • Vue 中 v-pre、v-once、v-cloak 标签的深度解析与案例展示
    目录v-prev-once​​​​​​​v-cloak​​​​​​​v-cloak介绍​​​​​​​插值表达式闪烁问题v-pre        当使用v-pre指令时,不会进行编译操作。所有的Vue模板语法都将得以完整保留,并会按照其初始的形态进行渲染。其中,最为常见的应用场景便是......