package com.alibaba.intl.batch.dependency;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.lang3.StringUtils;

/**
 * 解压工具类
 * @author hollis
 *
 */
public class PackDecompressor {
    public static int BUFFER_SIZE = 2048;

    public static void main(String[] args) throws Exception {
            unTarGZ("/home/hollis/Downloads/a.tgz", "/home/hollis/Downloads/a");
    }

    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();
       }
   }
}

Java文件解压之TGZ解压的更多相关文章

  1. 一个 java 文件的执行过程详解

    平时我们都使用 idea.eclipse 等软件来编写代码,在编写完之后直接点击运行就可以启动程序了,那么这个过程是怎么样的? 总体过程 我们编写的 java 文件在由编译器编译后会生成对应的 cla ...

  2. Linux解压.tar .tgz .tar.gz .tar.Z等文件

    .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ---------------------- ...

  3. linux的压缩解压命令全解

    .tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)——————————————— .zip解压:un ...

  4. WinRar:你需要从上一压缩卷启动解压命令以便解压

    大文件被分解成许多个小的RAR文件,并按顺序排列好,解压时只需解压第一个RAR文件即可顺利解压所有文件,如果不按顺序解压就会出现上述问题,导致解压完一个子文件候无法解压剩下的文件

  5. 把java文件打包成.jar (jar命令详解)

    把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...

  6. package-info.java文件详解

    欢迎关注我的社交账号: 博客园地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html GitHub地址: https://github.com/ji ...

  7. Java:文件类File的详解

    File类的常用方法: 1.创建     boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false.和输出流不一样,输出流对象一建立创建文件,而 ...

  8. cmd编译运行Java文件详解

    ①准备工作 首先用记事本编写HelloWorld.java放至G:\Javaspace路径 public class HelloWorld{ public static void main(Strin ...

  9. linux 压缩文件 及压缩选项详解

    本文介绍linux下的压缩程序tar.gzip.gunzip.bzip2.bunzip2.compress.uncompress. zip. unzip.rar.unrar等程式,以及如何使用它们对. ...

随机推荐

  1. js文本框验证

    1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'')" onafte ...

  2. CSS练习

    看到一个CSS参考手册:http://css.doyoe.com/ 感谢感谢!

  3. Linux使用标准IO的调用函数,分3种形式实现

    /*根据cp命令的格式要求,设计一个类cp的功能程序,要求使用标准IO的调用函数,分3种形式实现,字符,行,块.并注意函数功能的分层*/ #include<stdio.h> #includ ...

  4. ThinkPHP/Common/extend.php

    <?php // +---------------------------------------------------------------------- // | ThinkPHP [ ...

  5. Nginx开启gzip压缩功能

    在Nginx安装完成之后,我们可以开启Gzip压缩功能,这里Nginx默认只能对text/html类型的文件进行压缩.下面的指令为开启Gzip的指令: gzip on; gzip_http_versi ...

  6. 如何成为一个牛掰的Java大神?

    一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133http://if ...

  7. Week1 Team Homework #3: 软件工程在北航

    在组内成员的共同努力,我们采访了几个学长学姐,顺利完成任务.反馈信息如下: 平均每周花在这门课上的时间 平均写的代码总行数 学到的最有用的部分 最没用的部分 <软件工程>最应该改进的地方 ...

  8. Ubuntu系统下USB转串口的使用

    PC系统是Ubuntu12.04,与路由器开发板之间用USB转串口线连接. 一.硬件连接 确认Ubuntu对USB转串口设备的支持. 1.# lsmod | grep usbserial如果有usbs ...

  9. Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld

    前言(Prologue) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Android ...

  10. CodeForces 173B Chamber of Secrets 二分图+最短路

    题目链接: http://codeforces.com/problemset/problem/173/B 题意: 给你一个n*m的地图,现在有一束激光从左上角往左边射出,每遇到‘#’,你可以选择光线往 ...