java_解压tar.z文件包(*.tar、*.z)

阅读更多

本文转载自 https://blog.csdn.net/Crazyer0214/article/details/78048434

一、文件格式介绍

最近从Linux系统中copy了一个tar。z压缩文件,用于解压测试。

文件格式为*.tar压缩包下,还有*.z压缩包

如:压缩包paid_orderlist_20170920.tar,该tar包下有一个paid_orderlist_20170920.z压缩包,z包下有一个数据文件paid_orderlist_20170920.dat

即如果获取paid_orderlist_20170920.dat文件,需要分别解压tar包和z包。

 

二、文件解压(java实现)

1.前言

目前网络上解压*.tar文件以及其他压缩格式文件的java例子很多,大多都使用的是

commons-compress-1.x.jar或者javatar-2.x.jar工具进行解压操作。但真正实现解压tar.z文件的例子确不多见。

tar.z格式作为linxu中常见压缩文件格式,java实现解压操作可能会在项目中经常遇到。在参照网上例子及个人实践总结后,成功实现了对该文件的解压操作。

2.jar包准备

所需jar包:commons-compress-1.x.jar(网上介绍说需1.7版本及以上,反正亲测1.4版本不行,下载了1.7版本测试成功)

推荐maven下载:

 

  1.  
  2.  
    org.apache.commons
  3.  
    commons-compress
  4.  
    1.7
  5.  

 

可从apache下载https://commons.apache.org/proper/commons-compress/download_compress.cgi 

3.java代码实现

 

 

  1.  
    import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
  2.  
    import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
  3.  
    import org.apache.commons.compress.compressors.z.ZCompressorInputStream;
  4.  
    import java.io.*;
  5.  
    import java.util.*;
  6.  
    /**
  7.  
    * java解压tar.z文件
  8.  
    */
  9.  
    public class TarZUtil{
  10.  
    public static void main(String[] args) {
  11.  
    File tarFile= new File("E:\\TARZ\\paid_orderlist_20170920.tar");
  12.  
    List zFileNames = unTarFile(tarFile);
  13.  
    for (String zFileName:zFileNames ){
  14.  
    File zFile = new File("E:\\TARZ\\"+zFileName);
  15.  
    unZFile(zFile,"E:\\TARZ\\");
  16.  
    }
  17.  
    }
  18.  
    /**
  19.  
    * 解压*.z文件 * @param file z包文件
  20.  
    * @param outPath z包下解压后文件存放路径
  21.  
    * @return 解压后文件
  22.  
    */
  23.  
    public static File unZFile(File file,String outPath) {
  24.  
    int buffersize = 2048;
  25.  
    FileOutputStream out = null;
  26.  
    ZCompressorInputStream zIn = null;
  27.  
    try {
  28.  
    FileInputStream fin = new FileInputStream(file);
  29.  
    BufferedInputStream in = new BufferedInputStream(fin);
  30.  
    // 若获取z文件名,最好使用lastIndexOf,不要使用indexOf,比如paid_orderlist_20170920.test.z
  31.  
    String name = file.getName() .substring(0, file.getName().lastIndexOf("."));
  32.  
    File outFile = new File(outPath+File.separator + name);
  33.  
    out = new FileOutputStream(outFile);
  34.  
    zIn = new ZCompressorInputStream(in);
  35.  
    final byte[] buffer = new byte[buffersize];
  36.  
    int n = 0;
  37.  
    while (-1 != (n = zIn.read(buffer))) {
  38.  
    out.write(buffer, 0, n);
  39.  
    }
  40.  
    return outFile;
  41.  
    }
  42.  
    catch (Exception e) {
  43.  
    e.printStackTrace();
  44.  
    return null;
  45.  
    }
  46.  
    finally {
  47.  
    try {
  48.  
    out.close();
  49.  
    zIn.close();
  50.  
    }
  51.  
    catch (IOException e) {
  52.  
    e.printStackTrace();
  53.  
    }
  54.  
    }
  55.  
    }
  56.  
    /**
  57.  
    * .TAR文件解压
  58.  
    * @param file
  59.  
    */
  60.  
    public static List unTarFile(File file) {
  61.  
    int buffersize = 2048;
  62.  
    String basePath = file.getParent() + File.separator;
  63.  
    TarArchiveInputStream is = null;
  64.  
    // 存储tar包下所有z文件名
  65.  
    List zFileNames = new ArrayList();
  66.  
    try {
  67.  
    is = new TarArchiveInputStream(new FileInputStream(file));
  68.  
    while (true) {
  69.  
    TarArchiveEntry entry = is.getNextTarEntry();
  70.  
    if (entry == null) {
  71.  
    break;
  72.  
    }
  73.  
    zFileNames.add(entry.getName());
  74.  
    if (entry.isDirectory()) {
  75.  
    // 一般不会执行
  76.  
    new File(basePath + entry.getName()).mkdirs();
  77.  
    } else {
  78.  
    FileOutputStream os = null;
  79.  
    try {
  80.  
    File f = new File(basePath + entry.getName());
  81.  
    if (!f.getParentFile().exists()) {
  82.  
    f.getParentFile().mkdirs();
  83.  
    }
  84.  
    if (!f.exists()) {
  85.  
    f.createNewFile();
  86.  
    }
  87.  
    os = new FileOutputStream(f);
  88.  
    byte[] bs = new byte[buffersize];
  89.  
    int len = -1;
  90.  
    while ((len = is.read(bs)) != -1) {
  91.  
    os.write(bs, 0, len);
  92.  
    }
  93.  
    os.flush();
  94.  
    }
  95.  
    catch (Exception e) {
  96.  
    e.printStackTrace();
  97.  
    }
  98.  
    finally {
  99.  
    os.close();
  100.  
    }
  101.  
    }
  102.  
    }
  103.  
    }
  104.  
    catch (Exception e) {
  105.  
    e.printStackTrace();
  106.  
    }
  107.  
    finally {
  108.  
    try {
  109.  
    is.close();
  110.  
    // 解压后删除tar包
  111.  
    // file.delete();
  112.  
    }
  113.  
    catch (IOException e) {
  114.  
    e.printStackTrace();
  115.  
    }
  116.  
    }
  117.  
    // 返回tar包下所有文件名
  118.  
    return zFileNames;
  119.  
    }
  120.  
    }

 

 

你可能感兴趣的:(tar.z,.z,解压)