Java之解压Tar.gz和Gz文件到指定的目录下

2023-10-27

工作中的需求:需要读取指定路径下的压缩文件,然后解压到指定的目录下

引入maven依赖

<dependency>
     <groupId>org.apache.ant</groupId>
     <artifactId>ant</artifactId>
     <version>1.10.5</version>
</dependency>
package com.example.javacode;

import org.apache.tools.tar.TarInputStream;
import java.io.*;
import java.util.zip.GZIPInputStream;

/**
 * @program: JavaCode
 * @ClassName FileUtils
 * @description:
 * @author: ltcz99
 * @create: 2023-04-16
 * @Version 1.0
 **/
public class FileUtils {


    /**
     * 解压tar.gz文件到指定目录
     * @param sourceDir 源文件夹
     * @param destDir 解压后的目标文件夹
     */
    public static void unTarGz(String sourceDir,String destDir) throws Exception{
        File outFile = new File(sourceDir);
        File[] files = outFile.listFiles();
        try{
            //创建输出目录
            createDirectory(destDir,null);
            TarInputStream tarIn;
            int index = 1;
            for (File file : files){
                if(file.getName().contains("tar.gz")){
                    tarIn = new TarInputStream(new GZIPInputStream(
                            new BufferedInputStream(new FileInputStream(file))),
                            1024 * 2);
                    String outFileName = destDir + "/" +index+++ ".log";
                    OutputStream out = new FileOutputStream(outFileName);
                    int length = 0;
                    byte[] b = new byte[2048];
                    while ((length = tarIn.read(b)) != -1){
                        out.write(b,0,length);
                    }
                    out.close();
                    tarIn.close();
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    /**
     * 解压gz到指定的文件夹下面
     * @param sourceDir
     * @param destDir
     */
    public static void unGzipFile(String sourceDir,String destDir) {
        //创建输出目录
        createDirectory(destDir,null);
        File sourceFile = new File(sourceDir);
        File[] files = sourceFile.listFiles();
        try {
            int index = 1;
            for(File file : files){
                if(file.getName().contains("gz")){
                    FileInputStream fin = new FileInputStream(file);
                    //建立gzip解压工作流
                    GZIPInputStream gzin = new GZIPInputStream(fin);
                    //建立解压文件输出流
                    File tmpFile = new File(destDir + "/" + index++  +".log");
                    FileOutputStream fout = new FileOutputStream(tmpFile);
                    int length;
                    byte[] buf = new byte[2048];
                    while ((length = gzin.read(buf, 0, buf.length)) != -1) {
                        fout.write(buf, 0, length);
                    }
                    gzin.close();
                    fout.close();
                    fin.close();
                }
            }
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }

    /**
     * 读取文件到指定的文件夹下面
     * @param sourceLogPath
     * @param destLogPath
     */
    public static void readFileToDestLogPath(String sourceLogPath, String destLogPath) {
        File sourceFile = new File(sourceLogPath);
        File[] files = sourceFile.listFiles();
        for (File file : files){
            String fileName = destLogPath + "/" + file.getName();
            File destFile = new File(fileName);
            if(file.getName().contains("log") && !fileName.contains("gz")){
                try {
                    if(destFile.exists()){
                        destFile.delete();
                    }
                    String logFile = sourceFile + "/" + file.getName();
                    FileInputStream fis = new FileInputStream(logFile);
                    FileOutputStream fos = new FileOutputStream(destFile);
                    BufferedInputStream bis = new BufferedInputStream(fis);
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                    int len = 0;
                    while ((len = bis.read()) != -1) {
                        bos.write(len);
                    }
                    bos.flush();
                    // 关闭资源
                    fis.close();
                    bis.close();
                    fos.close();
                    bos.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }

    }
    /**
     * 创建目录
     * @param outputDir
     * @param subDir
     */
    public static void createDirectory(String outputDir,String subDir){
        File file = new File(outputDir);
        //子目录不为空
        if(!(subDir == null || subDir.trim().equals(""))){
            file = new File(outputDir + "/" + subDir);
        }
        if(!file.exists()){
            if(!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            file.mkdirs();
        }
    }

    public static void main(String[] args) throws Exception {
        String sourceDir = "/Users/ltcz99/Downloads/templog";
        String destDir = "/Users/ltcz99/Downloads/unzip/";
        //解压.gz文件到指定的文件件下面
        unGzipFile(sourceDir,destDir);
        // 解压tar.gz文件到指定的文件夹下面
        unTarGz(sourceDir,destDir);
        //读取特定的文件到指定的文件夹下面
        readFileToDestLogPath(sourceDir,destDir);
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java之解压Tar.gz和Gz文件到指定的目录下 的相关文章

  • 在 JTable 中移动行

    我使用 MVC 模式 并且有一个如下所示的 JTable List
  • 热重载在docker中运行的java程序

    我开发了一个java程序 应该在docker中运行 然而 我在调试docker中运行的java程序时遇到了很多痛苦 我在网上搜索 一些教程提出了像 spring dev tools 这样的工具 因为我的java程序是基于spring boo
  • Java 中的 XPath 节点集

    我在 eclipse 中有这段代码 NodeSet nodes NodeSet xPath evaluate expression inputSource XPathConstants NODESET 它给我 NodeSet 上的编译时错误
  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • java.io.IOException: %1 不是有效的 Win32 应用程序

    我正在尝试对 XML 文档进行数字签名 为此我有两个选择 有一个由爱沙尼亚认证中心为程序员创建的库 还有一个由银行制作的运行 Java 代码的脚本 如果使用官方 认证中心 库 那么一切都会像魅力一样进行一些调整 但是当涉及到银行脚本时 它会
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • 当单元格内的 JComboBox 中有 ItemEvent 时,如何获取 CellRow

    我有一个 JTable 其中有一列包含 JComboBox 我有一个附加到 JComboBox 的 ItemListener 它会根据任何更改进行操作 但是 ItemListener 没有获取更改的 ComboBox 所在行的方法 当组合框
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个

随机推荐

  • 决策树分类器DecisionTreeClassifier参数解释

    sklern中使用sklearn tree DecisionTreeClassifier类来实现决策树分类算法 模型调参常用参数如下 名称 功能 描述 criterion 特征选择标准 gini or entropy default gin
  • 软件测试/测试开发丨学会与 AI 对话,高效提升学习效率

    点此获取更多相关资料 简介 ChatGPT 的主要优点之一是它能够理解和响应自然语言输入 在日常生活中 沟通本来就是很重要的一门课程 沟通的过程中表达越清晰 给到的信息越多 那么沟通就越顺畅 和 ChatGPT 沟通也是同样的道理 如果想要
  • 内网工作站部署

    概述 为了方便做各种实验 我买了几台服务器放在家里 服务器上安装了虚拟化系统 运行的虚拟机有十几台 在家里的时候 我可以很方便的连接服务器 但是到了单位或出差的时候 连接服务器变得比较麻烦了 最开始我使用各种内网穿透的方案 但是虚拟机很多
  • SylixOS热插拔实现实例(四)

    1 网卡热插拔实现 SylixOS中 热插拔消息是在创建热插拔设备时产生 由热插拔设备驱动实现 下面介绍以网卡热插拔为例 介绍网卡热插拔消息产生流程 以mini2440网卡驱动为例 驱动程序通过调用API HotplugPollAdd函数将
  • 向数组中输入字符串的三种方法

    像一维数组中输入一串字符并输出 第一种方法 用gets 获取字符串 输出结果 第二种方法 利用scanf输入字符 注意不能获取空格 结果 第三种方法 利用while循环getcchar 结果
  • C#如何调用外部exe程序

    http blog csdn net cyamazing article details 52849106 1 在主界面添加调用外部exe程序的Button 双击此Button进入代码编辑页面 在程序的开始using System Diag
  • OpenCV阈值处理(threshold函数、自适应阈值处理、Otsu处理)

    目录 阈值处理 一 threshold函数 1 二值化阈值处理 cv2 THRESH BINARY 2 反二值化阈值处理 cv2 THRESH BINARY INV 3 截断阈值化处理 cv2 THRESH TRUNC 4 超阈值零处理 c
  • 刷脸支付能够很好的解决扫码支付的弊端

    刷脸支付设备采用的是目前安全系数最高的3D结构光摄像头技术 使用毫米级景深信息检测 在用户第一次使用时 就通过光感点阵 采集了用户独一无二的生物身份信息 然后与实名认证后的支付宝账号相连 来达到安全支付的效果 也就是说 就算不法分子拿着我们
  • cpp在vector中查找find元素

    假如我有一个vector数组 需要查询某个数是否在数组中 某个数在数组中第一次出现的位置 这个时候就需要用到
  • Python——UDP Socket实现视频互传,远程调用另一台电脑摄像头(cv2)

    一台电脑当服务器多线程提供摄像头服务 支持多台电脑调用 目录 一台电脑当服务器多线程提供摄像头服务 支持多台电脑调用 一 效果展示 和舍友联机 多台电脑效果 二 带注释的代码 1 服务端 2 客户端 一 效果展示 和舍友联机 多台电脑效果
  • 力扣刷题 每日两题(一)

    一 力扣20题 class Solution object def isValid self s type s str rtype bool if len s 0 return True stack for c in s if c or c
  • FISCO-BCOS 一、默认配置搭建区块链网络

    一 采用默认配置搭建区块链网络 1 安装openssl ubuntu依赖 sudo apt install y openssl curl 2 创建操作目录 下载安装脚本 cd mkdir p fisco cd fisco 3 搭建单群组4节
  • 面试分享

    在软件测试的面试过程中 经常会出一些测试基础的问题 以此来评估应聘者的基本测试功底和知识储备 下面我就为大家整理了一些软件测试常见面试题及答案 仅供参考 之前的推文也有分享过相关的软件测试面试题 正在准备面试的小伙伴们可以进入本公众号 面试
  • flutter内存泄漏常见分析

    内存泄漏是Flutter中的一个常见问题 以下是一些可能导致内存泄漏的情况和注意事项 未释放控制器 在使用一些控制器 如AnimationController TextEditingController等 时 需要在不需要时及时释放控制器
  • 创建线程的方式打开记事本

    更好的阅读体验 huge color red 更好的阅读体验 更好的阅读体验 今天操作系统课老师讲到进程 提出了一个有趣的小实验 能否以系统调用的方式利用 Windows 创建进程的系统调用函数来打开一个软件 闲着蛋疼的我立马来了兴趣 姑且
  • unity开发VR,没有VR设备解决方式

    文章目录 前言 一 环境搭建 1 普通VR环境搭建 2 虚拟相机搭建 二 模拟相机的操作 总结 前言 开发实例环境为unity2018 4 11 VRTK3 3 0 steamVR1 2 23 当我们身边没有HTC VIVE设备时我们不能去
  • Android Studio中的mavenCentral、jcenter、google仓库

    一 Android Studio中依赖是从哪里得到 是从工程的build gradle里面定义的Maven仓库服务器去下载library的 总的来说 只有两个标准的Android library文件服务器 mavenCentral和jcen
  • AES加密和解密详解

    本文使用的是cyrpto js库 以AES CBC为例 先安装cyrpto js cyrpto js是js专门用来加密和解密用到的一个库 第一步 先确认一下电脑是否有node和npm 输入node version显示 v 版本号就可以下一步
  • RPMB分区介绍

    RPMB Replay Protected Memory Block重放保护内存块 Partition 是 eMMC 中的一个具有安全特性的分区 eMMC 在写入数据到 RPMB 时 会校验数据的合法性 只有指定的 Host 才能够写入 同
  • Java之解压Tar.gz和Gz文件到指定的目录下

    工作中的需求 需要读取指定路径下的压缩文件 然后解压到指定的目录下 引入maven依赖