- 直接上代码
import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarInputStream;
import java.io.*;
import java.util.zip.GZIPInputStream;
/**
* 解压tar.gz
*/
public class JieyaTar2 {
public static void main(String[] args) {
JieyaTar2 tar = new JieyaTar2();
//解压tar,并返回一个解压路径
String path = tar.testUnTarGz();
System.out.println("解压后的路径: " + path);
}
private String testUnTarGz() {
File srcTarGzFile = new File("f:/wjh.tar.gz");//要解压缩的tar.gz文件对象
String jieyePath = "f:/wjh33";//把解压的文件放置到c盘下的wjh33目录下面
boolean boo = false;//是否压缩成功
try {
unTarGz(srcTarGzFile,jieyePath);
boo = true;
} catch (IOException e) {
throw new RuntimeException(e);
}finally{
//清理操作
if(!boo)
deleteDirectory(new File(jieyePath));//目标文件夹 。清理
}
return jieyePath;
}
//清理文件(目录或文件)
private void deleteDirectory(File file) {
if(file.isFile()){
file.delete();//清理文件
}else{
File list[] = file.listFiles();
if(list!=null){
for(File f: list){
deleteDirectory(f);
}
file.delete();//清理目录
}
}
}
/**
*
* @param file: 要解压的tar.gz文件对象
* @param outputDir: 要解压到某个指定的目录下
*/
private void unTarGz(File file,String outputDir) throws IOException{
TarInputStream tarIn = null;
try{
tarIn = new TarInputStream(new GZIPInputStream(
new BufferedInputStream(new FileInputStream(file))),
1024 * 2);
createDirectory(outputDir,null);//创建输出目录
TarEntry entry = null;
while( (entry = tarIn.getNextEntry()) != null ){
if(entry.isDirectory()){//是目录
createDirectory(outputDir,entry.getName());//创建空目录
}else{//是文件
File tmpFile = new File(outputDir + "/" + entry.getName());
createDirectory(tmpFile.getParent() + "/",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);
}
}catch(IOException ex){
throw ex;
}finally{
if(out!=null)
out.close();
}
}
}
}catch(IOException ex){
throw new IOException("解压归档文件出现异常",ex);
} finally{
try{
if(tarIn != null){
tarIn.close();
}
}catch(IOException ex){
throw new IOException("关闭tarFile出现异常",ex);
}
}
}
private void createDirectory(String outputDir,String subDir) {
File file = new File(outputDir);
if(!(subDir == null || subDir.trim().equals(""))){//子目录不为空
file = new File(outputDir + "/" + subDir);
}
if(!file.exists()){
file.mkdirs();
}
}
}
注意:
- 原先是新建了一个文件夹: f:/wjh,这个文件夹中保存了多个json文件,然后将该文件夹压缩成wjh.tar.gz
- 新建了一个保存解压文件的文件夹,路径为: f:/wjh33
- 解压后的文件夹中会多一个wjh的文件夹,其中是原先包含的多个json文件