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. MySQL实战积累

    IFNULL(expr1,expr2)的用法:假如expr1不为NULL,则IFNULL()的返回值为   expr1; 否则其返回值为expr2. 索引:http://www.cnblogs.com ...

  2. python杂记-6(time&datetime模块)

    #!/usr/bin/env python# -*- coding: utf-8 -*-import timeprint(time.clock())##返回处理器时间,3.3开始已废弃 , 改成了ti ...

  3. stringlist

    #ifndef _STRINGLIST_HPP_#define _STRINGLIST_HPP_ #include "../global.hpp"#include <type ...

  4. 【js】 流式布局 页面

    <!DOCTYPE html><html><head> <meta content="text/html; charset=utf-8" ...

  5. 【BZOJ 3504】[Cqoi2014]危桥

    Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多 ...

  6. Qt postEvent

    Qt3中可以直接向线程发送消息 QThread::postEventQ4中已不支持为了模拟向线程发送消息,可以通过QObject::moveToThread后,然后再向这个QObject发送消息 ob ...

  7. 如何在eclipse中添加android ADT

    百度经验:http://jingyan.baidu.com/article/b0b63dbfa9e0a74a4830701e.html 截图:

  8. js eval()执行传参函数的写法

    .cs public class Message<T> { // 数据总数 public int? Total { get; set; } // 关键数据 public List<T ...

  9. eclipse 配置git ssh登录

    实现需要安装git的插件,由于我使用的adt和eclipse for javaee版本两个,都已经安装了git插件,就不再演示了,网上都有. 这篇文章主要是介绍使用ssh进行认证的方式. 1.首先,配 ...

  10. 1069: [SCOI2007]最大土地面积 - BZOJ

    Description 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大.Input 第1行一个正整数N,接下来N行,每行2个数x,y, ...