java的tgz解压工具类

前言
之前在代码上一直使用的是对zip的解压,最近对接方居然使用了tgz的压缩包,在网上找了一个工具类,在项目测试,使用。
直接贴上tgz解压代码。

public class PackDecompressor {

    public static int BUFFER_SIZE = 2048;

    public static void main(String[] args) throws Exception {
        unTarGZ("D:\\test\\payresult_fix_20190318.txt.tgz", "D:\\test\\aaa");
    }

    public static void unTarGZ(String file, String destDir) throws Exception {
        File tarFile = new File(file);
        unTarGZ(tarFile, destDir);
    }

    public static void unTarGZ(File tarFile, String destDir) throws Exception {
        if (StringUtils.isBlank(destDir)) {
            destDir = tarFile.getParent();
        }
        destDir = destDir.endsWith(File.separator) ? destDir : destDir + File.separator;
        unTar(new GzipCompressorInputStream(new FileInputStream(tarFile)), destDir);
    }

    private static void unTar(InputStream inputStream, String destDir) throws Exception {

        TarArchiveInputStream tarIn = new TarArchiveInputStream(inputStream, BUFFER_SIZE);
        TarArchiveEntry entry = null;
        try {
            while ((entry = tarIn.getNextTarEntry()) != null) {

                if (entry.isDirectory()) {//是目录
                    createDirectory(destDir, entry.getName());//创建空目录
                } else {//是文件
                    File tmpFile = new File(destDir + File.separator + entry.getName());
                    createDirectory(tmpFile.getParent() + File.separator, null);//创建输出目录
                    OutputStream out = null;
                    try {
                        out = new FileOutputStream(tmpFile);
                        int length = 0;
                        byte[] b = new byte[2048];
                        while ((length = tarIn.read(b)) != -1) {
                            out.write(b, 0, length);
                        }
                    } finally {
                        IOUtils.closeQuietly(out);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            IOUtils.closeQuietly(tarIn);
        }
    }

    public static void createDirectory(String outputDir, String subDir) {
        File file = new File(outputDir);
        if (!(subDir == null || subDir.trim().equals(""))) {//子目录不为空
            file = new File(outputDir + File.separator + subDir);
        }
        if (!file.exists()) {
            file.mkdirs();
        }
    }
}
ZArchiver捐赠 ZArchiver捐赠 - 捐赠项目的特殊版本程序。目前只在应用程序图标中与免费版本不同。 ZArchiver捐赠 - ZArchiver的特殊版本,用于捐赠给项目。 专业版的优点: - 浅色和深色主题; - 密码存储; - 存档中的图像预览; - 编辑档案中的文件(见注释); ZArchiver - 是一个档案管理程序。它有一个简单而实用的界面。 ZArchiver让您: - 创建以下存档类型:7z(7zip),zip,bzip2(bz2),gzip(gz),XZ,tar; - 解压缩以下存档类型:7z(7zip),zip,rar,rar5,bzip2,gzip,XZ,iso,tar,arj,cab,lzh,lha,lzma,xar,tgz,tbz,Z,deb,rpm, zipx,mtz,chm,dmg,cpio,cramfs,img(fat,ntfs,ubf),wim,ecm,arc(freearc); - 查看存档内容:7z(7zip),zip,rar,rar5,bzip2,gzip,XZ,iso,tar,arj,cab,lzh,lha,lzma,xar,tgz,tbz,Z,deb,rpm,zipx, mtz,chm,dmg,cpio,cramfs,img(fat,ntfs,ubf),wim,ecm,arc(freearc); - 创建解压缩受密码保护的档案; - 编辑档案:在档案中添加/删除文件(zip,7zip,tar,apk,mtz); - 创建解压缩多部分档案:7z,rar(仅解压缩); - 部分档案减压; - 打开压缩文件; - 从邮件应用程序打开存档文件; - 提取拆分档案:7z,zip和rar(7z.001,zip.001,part1.rar,z01); 主要特点: - 多线程支持(对多核处理器有用); - 支持文件名的UTF-8 / UTF-16。允许您在文件名中使用国家符号; - 无需启用多选模式。您可以通过单击文件名左侧的图标来选择文件; 注意!欢迎任何有用的想法和愿望。您可以通过电子邮件发送或只是在这里发表评论。 注意: 存档中的文件修改可以在外部程序中更改文件后更新存档中的文件。要执行此操作:从存档打开文件,选择应用程序(如果需要),编辑文件,保存更改,返回ZArchiver。当您返回ZArchiver时,将提示您更新存档中的文件。如果由于某种原因未提示更新文件,则可以在Android / ru.zdevs.zarchiver.pro / temp /中的存储卡上找到修改后的文件。 迷你FAQ: 问:什么密码? 答:某些档案的内容可能会被加密,档案只能用密码打开(不要使用手机密码!)。 问:程序运行不正常? A:给我发一封电子邮件,详细说明问题。 问:如何压缩文件? 答:通过单击图标(从文件名左侧)选择要压缩的所有文件。单击所选文件之一,然后从菜单中选择“压缩”。设置所需选项,然后按OK按钮。 问:如何提取文件? 答:单击存档名称并选择合适的选项(“在此提取”或其他)。 什么是新的 0.9.0 - 扩展Android 7/8支持; - 7zip更新为lates版本; - LZ4支持; - 修复三星设备; - 支持PIPE格式; - 更新图标和主题; - 其他修复和改进。
Java解压tgz包可以使用Apache Commons Compress库。 以下是示例代码: ```java import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; import java.io.*; public class TgzExtractor { public static void extract(String filePath, String outputDir) throws IOException { FileInputStream fis = new FileInputStream(filePath); BufferedInputStream bis = new BufferedInputStream(fis); GzipCompressorInputStream gzis = new GzipCompressorInputStream(bis); TarArchiveInputStream tis = new TarArchiveInputStream(gzis); File outDir = new File(outputDir); if (!outDir.exists()) { outDir.mkdirs(); } try { byte[] buffer = new byte[4096]; while (true) { TarArchiveInputStream.Entry entry = tis.getNextTarEntry(); if (entry == null) { break; } File file = new File(outDir, entry.getName()); if (entry.isDirectory()) { if (!file.exists()) { file.mkdirs(); } } else { OutputStream os = new FileOutputStream(file); try { int count; while ((count = tis.read(buffer)) != -1) { os.write(buffer, 0, count); } } finally { os.close(); } } } } finally { tis.close(); } } public static void main(String[] args) throws IOException { String filePath = "example.tgz"; String outputDir = "output"; extract(filePath, outputDir); } } ``` 在上面的代码中,我们首先创建一个 `FileInputStream` 对象来打开tgz文件,然后创建一个 `GzipCompressorInputStream` 对象将其解压缩。接下来,我们使用 `TarArchiveInputStream` 对象来遍历tgz文件中的每个文件,并将它们解压到指定的输出目录中。如果要解压缩其他类型的压缩文件,可以使用类似的方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值