Java 解析 Linux 不同压缩文件的方法及注意事项

背景

commons-compress 包提供了归档压缩文件的工具类,java.util 里面包含了 Zip 和 gz 文件的解压方法,最终以按扁平方式,遍历到全部文件的文件,包括子目录下的文件。使用 Java 实现的日志采集系统涉及到对压缩文件的解析,不同类型的压缩文件,Java 解析方式也不相同,本文整理 Java 解析四类常见压缩文件的方法及注意事项。

关键点在于辨别压缩文件的类型及对应生成命令,确保文件名称的后缀名和生成工具保持一致,否则容易出现解析异常,总结几个点就是:

  1. tar -cvf 生成的普通打包文件,后缀名为 .tar ,文件只归档,不压缩,文件较大。
  2. tar -czvf-z 参数代表用 gzip 压缩,生成 tar.gz 压缩的归档文件。
  3. zip -r 生成的 .zip 压缩文件,可以对目录进行压缩。
  4. gzip 文件名称,单文件压缩工具,对目标文件压缩后生成 .gz 的文件,且删除原文件。

四种压缩方式,入参压缩文件输入流 commpressIns 的各种压缩方式的读取流程。

tar

tar 命令生成的无压缩归档文件,体积比较大,一般不单独使用,它的解析方式为:

public void parseTarGzFile(InputStream commpressIns) {TarArchiveInputStream archiveInputStream = new TarArchiveInputStream(commpressIns, "UTF-8");InputStreamReader inputStreamReader = null;TarArchiveEntry currentEntry;try {currentEntry = (TarArchiveEntry) archiveInputStream.getNextEntry();// 循环遍历归档条目while (currentEntry != null) {String subfileName = currentEntry.getName();inputStreamReader = new InputStreamReader(archiveInputStream)// TODO inputStreamReader 逐行读取当前压缩文件条目的内容}} catch (Exception e) {// TODO error }    
}

使用 TarArchiveInputStream 它直接将压缩文件的各个文件都递归列出来,逐个读取就可完成遍历,它跟 zip 文件不一样,文件夹不会被作为一个 Entry ,所以还是比较容易的。

tar.gz

使用 tar -zc 生成的压缩文件,它有两种特性,一个是归档,二是 gzip 的压缩格式,流程与 tar 文件解析一致,但是需要包裹一层 GZip 输入流:

public void parseTarGzFile(InputStream commpressIns) {// 用 gzip 包裹一层GZIPInputStream gzInstream = new GZIPInputStream(commpressIns);TarArchiveInputStream archiveInputStream = new TarArchiveInputStream(gzInstream, "UTF-8");InputStreamReader inputStreamReader = null;TarArchiveEntry currentEntry;try {currentEntry = (TarArchiveEntry) archiveInputStream.getNextEntry();// 循环遍历归档条目while (currentEntry != null) {String subfileName = currentEntry.getName();inputStreamReader = new InputStreamReader(archiveInputStream)// TODO inputStreamReader 逐行读取当前压缩文件条目的内容}} catch (Exception e) {// TODO error }    
}

必须使用 tar -z 参数生成的文件,用 TarArchiveInputStream 解析时传入的是 GZIPInputStream 类型,否则非 gzip 压缩的 tar 文件,解析时会包 「非 Gzip Format 」异常 。

zip

zip -r 对文件夹压缩产生的的 zip 文件用 ZipInputStream 解析 。

public void parseZipFile(InputStream commpressIns) {ZipInputStream zipStream = new ZipInputStream(commpressIns);ZipEntry entry;InputStreamReader inputStreamReader = null;while ((entry = zis.getNextEntry()) != null) {// 注意事项:忽略文件夹名称条目String fileName = entry.getName();if (fileName.endsWith("/")) {continue;}inputStreamReader = new InputStreamReader(zipStream, "UTF-8");// TODO inputStreamReader 逐行读取当前压缩文件条目的内容}
}

ZipInputStream 会以递归压缩文件,最终扁平化对所有文件形成一个链表,启动文件夹也会作为一个 ZipEntry ,以 / 结尾,实际内容为空,所以解析时忽略即可。

gz

gzip 读单个文件生成的压缩文件解析比较简单:

public void parseGzipFile(InputStream commpressIns) {GZIPInputStream gzipInput = new GZIPInputStream(commpressIns);InputStreamReader reader = new InputStreamReader(gzipInput, "UTF-8");// TODO 直接逐行读取文件内容
}       

直接转换为 GZIPInputStream 就可以读取文件内容了。

启示录

zip 的解析目录中存在文件夹的条目,这点跟 tar 归档方式不同,需要注意。此外,解压工具会对文件格式进行校验,当文件后缀和文件格式不一致时,解析异常,需要特别注意。

比如我常用 tar -cvf 打包文件但是命名为 tar.gz ,之前没有特别留意过,直到解析异常。为止防手滑,专门分析四类压缩文件的生成方式及解析方法,整理成文、以备后用。

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

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

相关文章

【Linux】套接字的理解 基于TCP协议的套接字编程(单/多进程 / 线程池|英汉互译 / C++)

文章目录 1. 前言1.1 网络方面的预备知识👇1.2 了解TCP协议 2. 关于套接字编程2.1 什么是套接字 Socket2.2 socket 的接口函数2.3 Udp套接字编程的步骤2.4 sockaddr 结构 3. 代码实现3.1 makefile3.2 log.hpp3.3 tcp_server.hpp① 框架② service() 通信服务③ init…

记录docker ps查找指定容器的几个命令

1.docker ps | grep registry 查询包含registry的容器 2.docker ps | grep -E "reigistry\s" 开启正则匹配模式,匹配registry后面为空格的容器,若是匹配一整行可以这样写docker ps | grep -E "^([0-9a-f]{12})\sregistry\s.*" 这…

电视机顶盒哪个牌子好?618畅销电视机顶盒排行榜

电视机顶盒是我们使用最多的,不管看直播、动画、追剧、上网课都少不了它的存在。大促期间很多朋友问我电视机顶盒哪个牌子好,小编按照各平台的销量情况整理了618畅销电视机顶盒排行榜,看看哪些品牌的电视机顶盒是最受欢迎的吧。 TOP 1&#x…

为了更全面地分析开发人员容易被骗的原因和提供更加深入的防范措施

为了更全面地分析开发人员容易被骗的原因和提供更加深入的防范措施,我们可以进一步探讨以下几个方面: 深入技术细节 不安全的代码注释和文档: 原因:开发人员在代码注释中可能会无意间透露敏感信息,如API密钥、密码或系…

通过扩展指令增强基于覆盖引导的模糊测试

本文由Bruno Oliveira于2024年4月25日发表于IncludeSec的官方网站上。作为IncludeSec的安全研究人员,在他们日常的安全审计和渗透测试工作中,有时需要为客户开发一些模糊测试工具。在安全评估方法中使用模糊测试技术,可以有效地在复杂的现代化…

git 派生仓库怎么同步主仓库的新分支

一、git 派生仓库怎么同步主仓库的新分支 要使你的Git派生仓库同步主仓库的新分支,请遵循以下步骤: 1、添加上游仓库(如果尚未添加): 如之前所述,确保上游仓库已经被添加到你的本地仓库。如果没有,使用命…

【Basic】BUU LFI COURSE

文章目录 前言一、BUU LFI COURSE二、知识点PHP的危险函数路径遍历攻击 解题感悟 前言 话不多说直接看题 一、BUU LFI COURSE emmm什么提示也没给啊&#xff0c;那只能点开看一看线索了 okok咱们先分析一下这段php代码 <?php /*** Created by PhpStorm.* User: jinzhao*…

哪类漏洞容易被攻破

这个取决于多种因素&#xff0c;包括漏洞的严重程度、攻击者的技术能力和资源、目标系统的安全配置等。然而&#xff0c;一些常见的漏洞类型由于其普遍性和严重性&#xff0c;往往更容易被攻破。 例如&#xff0c;跨站脚本&#xff08;XSS&#xff09;漏洞是一种非常常见的安全…

怎么安装django特定版本

要安装Django的特定版本&#xff0c;你可以使用Python的包管理工具pip。以下是在命令行中安装Django特定版本的步骤&#xff1a; 确保你的计算机上已经安装了Python和pip。如果没有安装&#xff0c;你可以从Python官方网站下载并安装最新版本的Python&#xff0c;pip通常会随Py…

【HCIP学习】RSTP和MSTP

一、RSTP&#xff08;Rapid Spanning Tree Protocol&#xff0c;快速生成树&#xff09; 1、背景&#xff1a;RSTP从STP发展而来&#xff0c;具备STP的所有功能&#xff0c;可以兼容stp运行 2、RSTP与STP不同点 &#xff08;1&#xff09;减少端口状态 STP:disabled\blockin…

线程的概念和控制

文章目录 线程概念线程的优点线程的缺点线程异常线程用途理解虚拟地址 线程控制线程的创建线程终止线程等待线程分离封装线程库 线程概念 什么是线程&#xff1f; 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一…

2024中青杯数学建模C题:“X 疾病”在人群中的传播代码论文思路分析

2024中青杯数学建模C题论文和代码已完成&#xff0c;代码为C题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型的评价…

c++ queue容器

在C标准库中&#xff0c;std::queue 是一个容器适配器&#xff0c;它提供了队列&#xff08;FIFO - First In First Out&#xff09;的数据结构。队列是一种特殊的线性数据结构&#xff0c;只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端…

nssctf(Web刷题)

[SWPUCTF 2021 新生赛]gift_F12 打开题目是一个时间页面&#xff0c;不过看了一会儿发现没有什么用 直接F12打开网页源代码 CtrlF搜索flag 找到了flag NSSCTF{We1c0me_t0_WLLMCTF_Th1s_1s_th3_G1ft} [第五空间 2021]签到题 NSSCTF{welcometo5space} [SWPUCTF 2021 新生赛…

钉钉算是在线办公系统的设计标杆,尽管它依然很难用

不吹不黑&#xff0c;钉钉界面谁的的确简洁&#xff0c;无奈它面向的是场景复杂的办公领域&#xff0c;导致其越来越臃肿难用&#xff0c;反正我是该研究研究&#xff0c;但绝对不会用的。 举报 评论 1

Invoking “make cmake_check_build_system“ failed

前言&#xff1a; 在看过站内其他的方法且试过之后没奏效之后&#xff0c;偶然&#xff0c;无意间&#xff0c;随手整对了&#xff0c;然后后续在老赵的文档也找到了原因&#xff0c;对的上号&#xff0c;那在此我提出一种新的方法&#xff0c;且很简单的小tips。首先先来看看…

如何用电脑批量操作多部手机

如果你有很多手机&#xff0c;然后需要在这些手机上同时执行相同的操作&#xff0c;这个时候如果能有一种办法批量操作&#xff0c;将会大大提高效率&#xff0c;节省很多时间。本文将介绍基于uiautomator2实现的群控手机方案。 uiautomator2 是 一种 Android 自动化测试框架&…

数据挖掘与机器学习——机器学习概述

一、什么是机器学习 机器学习的英文名称叫Machine Learning&#xff0c;简称ML&#xff0c;该领域主要研究的是如何使计算机能够模拟人类的学习行为从而获得新的知识。 机器学习与数据挖掘的联系&#xff1a;简单来说&#xff0c;机器学习就是让计算机从大量 的数据中学习到相关…

yaml文件格式详解 及 k8s实战演示

目录 一 k8s 支持的语言格式 1&#xff0c;YAML 语法格式 2&#xff0c;查看 api 资源版本标签 二 k8s 运行nginx pod实例 yaml文件 具体讲解 1&#xff0c;写一个yaml文件demo 2&#xff0c;deployment 管理nginx 的yaml 文件 3&#xff0c;创建资源对象 4&#…

【四、性能测试】Linux stress 压力模拟测试工具

在做 CPU 问题解析之前&#xff0c;需要先了解一下压力模拟工具&#xff0c;可以将 CPU、MEM、IO 等进行压力模拟&#xff0c;可以在模拟压力的过程中进行问题解析 一、STRESS 模拟对CPU、Memory、IO、磁盘进行压力测试。可以使用 stress 工具&#xff0c;它是专门针对 linux…