这里使用apache commons compress对.tar.Z格式文件进行解压。

对于一个文件test.tar.Z,我们可以将解压过程理解为:

  1. 将test.tar.Z解压为test.tar;
  2. 将test.tar解压为test。

根据apache commons compress的示例:

解压.Z文件示例:

InputStream fin = Files.newInputStream(Paths.get("archive.tar.Z"));
BufferedInputStream in = new BufferedInputStream(fin);
OutputStream out = Files.newOutputStream(Paths.get("archive.tar"));
ZCompressorInputStream zIn = new ZCompressorInputStream(in);
final byte[] buffer = new byte[buffersize];
int n = 0;
while (-1 != (n = zIn.read(buffer))) {
out.write(buffer, 0, n);
}
out.close();
zIn.close();

解压tar文件示例:

Adding an entry to a tar archive:

TarArchiveEntry entry = new TarArchiveEntry(name);
entry.setSize(size);
tarOutput.putArchiveEntry(entry);
tarOutput.write(contentOfEntry);
tarOutput.closeArchiveEntry();

Reading entries from an tar archive:

TarArchiveEntry entry = tarInput.getNextTarEntry();
byte[] content = new byte[entry.getSize()];
LOOP UNTIL entry.getSize() HAS BEEN READ {
tarInput.read(content, offset, content.length - offset);
}

apache commons compress的maven地址如下:

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.16.1</version>
</dependency>

测试程序:

package test;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List; import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.compressors.z.ZCompressorInputStream;
import org.apache.commons.compress.utils.IOUtils; public class TestUncompressTarZ {
public static void compressTest() throws IOException {
// 将tar.Z解压为tar
System.out.println("uncompress tar.Z to tar...");
InputStream fin = Files.newInputStream(Paths.get("D:\\test.tar.Z"));
BufferedInputStream in = new BufferedInputStream(fin);
OutputStream out = Files.newOutputStream(Paths.get("D:\\test.tar"));
ZCompressorInputStream zIn = new ZCompressorInputStream(in);
byte[] buffer = new byte[1024];
int n = 0;
while (-1 != (n = zIn.read(buffer))) {
out.write(buffer, 0, n);
}
out.close();
zIn.close();
System.out.println("uncompress tar.Z to tar finished!");
// 将tar解压为文件夹
System.out.println("uncompress tar to directory file...");
List<String> fileNames = new ArrayList<String>();
InputStream inputStream = new FileInputStream(new File("D:\\test.tar"));
TarArchiveInputStream tarIn = new TarArchiveInputStream(inputStream, 1024);
TarArchiveEntry entry = null;
while ((entry = tarIn.getNextTarEntry()) != null) {
System.out.println("... " + entry.getName() + " , " + entry.isDirectory());
fileNames.add(entry.getName());
if (entry.isDirectory()) {//是目录
File tmpDir = new File("D:\\test\\" + entry.getName());
if (tmpDir.exists() == false) {
tmpDir.mkdirs();
}
} else {//是文件
File tmpFile = new File("D:\\test\\" + entry.getName());
File tmpDir = tmpFile.getParentFile();
System.out.println("parent: " + tmpDir.getAbsolutePath());
if (tmpDir.exists() == false) {
tmpDir.mkdirs();
}
OutputStream outputStream = new FileOutputStream(tmpFile);
int length = 0;
byte[] b = new byte[1024];
while ((length = tarIn.read(b)) != -1) {
outputStream.write(b, 0, length);
}
}
}
IOUtils.closeQuietly(tarIn);
System.out.println("uncompress tar to directory file finished!");
System.out.println("all finished!");
} public static void main(String[] args) throws IOException {
compressTest();
}
}

在这个测试程序中,首先将test.tar.Z解压为test.tar,然后将test.tar解压为一个名为test的文件。

Java解压tar.Z文件(使用Apache Commons-compress)的更多相关文章

  1. 【转】JAVA解压.TAR.Z及.ZIP文件

     解压.ZIP文件 package app.qdupr.Method; import java.io.File; import java.io.FileOutputStream; import jav ...

  2. 解压tar.gz文件报错gzip: stdin: not in gzip format解决方法

    解压tar.gz文件报错gzip: stdin: not in gzip format解决方法 在解压tar.gz文件的时候报错 1 2 3 4 5 [Sun@localhost Downloads] ...

  3. tar解压.tar.bz2文件失败:tar: Error is not recoverable: exiting now

    使用tar解压.tar.bz2文件: tar -jxvf xxxx.tar.bz2 报如下错误: 原因:未安装bzip yum -y install bzip2

  4. [Linux] 解压tar.gz文件,解压部分文件

    遇到数据库无法查找问题原因,只能找日志,查找日志的时候发现老的日志都被压缩了,只能尝试解压了   数据量比较大,只能在生产解压了,再进行查找 文件名为*.tar.gz,自己博客以前记录过解压方法: h ...

  5. 【java】 java 解压tar.gz读取内容

    package com.xwolf.stat.util; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson. ...

  6. Linux使用shell解压tar.Z格式文件

    建设当前目录下有一个名为test.tar.Z的文件. 使用如下指令可以将其解压,并将解压后的所有文件放置在当前目录下: zcat test.tar.Z | tar -xvf - 如果想要将解压缩的文件 ...

  7. Linux(Ubuntu) 下如何解压 .tar.gz 文件

    在终端输入以下命令即可解压: tar -zxvf YOUR_FILE_NAME.tar.gz 如果出现“权限不够”的错误提示,在命令前加上 sudo ,即 sudo tar -zxvf YOUR_FI ...

  8. linux命令(及解压tar.gz文件)

    https://wenku.baidu.com/view/f5805017866fb84ae45c8df3.html 1.压缩命令: 命令格式:tar  -zcvf   压缩文件名.tar.gz   ...

  9. tar命令--数据解档(三)解压.tar.gz文件报错 gzip:stdin:not in gzip format

    毕竟是生产..... 提示以下信息:  gzip: stdin: not in gzip format  tar: Child returned status 1  tar: Error is not ...

随机推荐

  1. PL/SQL复合类型

    一.PL/SQL记录:一条记录. 可简化单行多列的数据的处理.当使用pl/sql记录时,应用开发人员即可以自定义记录类型和记录变量,也可以使用%rowtype属性直接定义记录变量. 1.当使用自定义的 ...

  2. SpringBoot项目mysql配置文件密码加密(jasypt)

    起因:因为我个人微博想要公开源码,但数据库配置文件会暴露在外面,又不想生产跟开发环境建来回切换,所以想到了加密数据库密码,于是问了群里的一个朋友小XX(原谅我不识字) 经过: 简单粗暴,直接上代码: ...

  3. 牛客练习赛33 E. tokitsukaze and Similar String (字符串哈希)

    题目链接:https://ac.nowcoder.com/acm/contest/308/E 题意:中文题 见链接 题解:哈希预处理(三哈希模板) #include <bits/stdc++.h ...

  4. sql server join ,inner join ,left join ,right join 的使用

    测试数据脚本 CREATE TABLE Atable ( S# INT, Sname nvarchar(32), Sage INT, Sfrom nvarchar(8) ) insert into A ...

  5. 树套树【bzoj3262】陌上花开

    /* [bzoj3262]陌上花开 2014年6月19日1,2430 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的 ...

  6. python3 数据类型测试

    type(要测试的数据):

  7. TortoiseGIT提交

    Git最新版下载地址:https://gitforwindows.org/ TortoiseGit,Git客户端,32/64位最新版及对应的语言包下载地址:https://tortoisegit.or ...

  8. ros平台下python脚本控制机械臂运动

    在使用moveit_setup_assistant生成机械臂的配置文件后可以使用roslaunch demo.launch启动demo,在rviz中可以通过拖动机械臂进行运动学正逆解/轨迹规划等仿真运 ...

  9. 在 Ubuntu 18.04 /centos7上安装 Python 3.7

    扩展源安装 sudo apt update sudo apt install software-properties-common sudo add-apt-repository ppa:deadsn ...

  10. properties的编码问题

    1.在eclipse中,如果不专门设置,properties文件的编码是ISO-8859-1,最好将其改为UTF-8 2.当properties文件的编码改为UTF-8还不够,Spring的conte ...