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. (转)可收缩、扩展的TextView

    在一些应用中,比如腾讯的应用市场APP应用宝,关于某款应用的介绍文字,如果介绍文字过长,那么不是全部展现出来,而是显示三四行的开始部分(摘要),预知全部的内容,用户点击展开按钮即可查阅全部内容.这样的 ...

  2. hdu 5545 The Battle of Guandu spfa最短路

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5545 题意:有N个村庄, M 个战场: $ 1 <=N,M <= 10^5 $; 其中曹 ...

  3. PAT IO-04 混合类型数据格式化输入(5)

    /* *PAT IO-04 混合类型数据格式化输入(5) *2015-08-01 作者:flx413 */ #include<stdio.h> int main() { int a; fl ...

  4. 常见前端面试题之HTML/CSS部分

    转自http://www.cnblogs.com/jscode/archive/2012/07/10/2583856.html Doctype是什么?如何触发严格模式与混杂模式模式?区分它们有何意义? ...

  5. wamp下修改mysql root用户的登录密码

    1.安装好wamp后,运行WampServer程序,进入MYSQL控制台; 2.进入控制台后,提示输入密码(不用输入任何密码,因为密码为空),按回车键进入; 3.输入“USE mysql;”然后回车, ...

  6. HTML+CSS入门

    <strong>加粗</strong> <em>斜体</em> <p>段落</p> <span>设置单独样式< ...

  7. c++ 关于换行符

    windows: \r\n linux: \n mac: \r http://blog.chinaunix.net/uid-12706763-id-10830.html 不同的OS有不同的换行符: O ...

  8. 16进制串hex与ASCII字符串相互转换

    提供两个函数,方便十六进制串与ASCII 字符串之间的相互转换,使用函数需要注意的是返回的串是在堆上通过 calloc 分配的,所以,记得使用完返回值释放该块,并且将指向该块的指针 =NULL . c ...

  9. GCD异步加载网络图片

    //image dispatch_queue_t network_queue; network_queue = dispatch_queue_create("com.myapp.networ ...

  10. Mac和iOS开发资源汇总

    小引 本文主要汇集一些苹果开发的资源,会经常更新,建议大家把这篇文章单独收藏(在浏览器中按command+D). 今天(2013年7月19日)收录了许多中文网站和博客.大家一定要去感受一下哦. 如果大 ...