在开发中我们经常需要对gz文件进行解压缩,在java中解压gz文件还是比较繁琐的,为此写了一个工具类方便需要的时候可以直接拿过来用。代码如下:
package com.eggsl.utils;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.utils.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
/**
* @author: xiaobaitu88
* @Date: 2019/10/23 21:19
* @Description:
*/
public class FileUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(FileUtils.class);
public static void main(String[] args) {
deCompressGZipFile("D:\\hello2.tar.gz", "D:\\ssl");
}
/**
* Tar文件解压方法
*
* @param tarGzFile 要解压的压缩文件名称(绝对路径名称)
* @param destDir 解压后文件放置的路径名(绝对路径名称)当路径不存在,会自动创建
* @return 解压出的文件列表
*/
public static void deCompressGZipFile(String tarGzFile, String destDir) {
// 建立输出流,用于将从压缩文件中读出的文件流写入到磁盘
TarArchiveEntry entry = null;
TarArchiveEntry[] subEntries = null;
File subEntryFile = null;
try (FileInputStream fis = new FileInputStream(tarGzFile);
GZIPInputStream gis = new GZIPInputStream(fis);
TarArchiveInputStream taris = new TarArchiveInputStream(gis);) {
while ((entry = taris.getNextTarEntry()) != null) {
StringBuilder entryFileName = new StringBuilder();
entryFileName.append(destDir).append(File.separator).append(entry.getName());
File entryFile = new File(entryFileName.toString());
if (entry.isDirectory()) {
if (!entryFile.exists()) {
entryFile.mkdir();
}
subEntries = entry.getDirectoryEntries();
for (int i = 0; i < subEntries.length; i++) {
try (OutputStream out = new FileOutputStream(subEntryFile)) {
subEntryFile = new File(entryFileName + File.separator + subEntries[i].getName());
IOUtils.copy(taris, out);
} catch (Exception e) {
LOGGER.error("deCompressing file failed:" + subEntries[i].getName() + "in" + tarGzFile);
}
}
} else {
checkFileExists(entryFile);
OutputStream out = new FileOutputStream(entryFile);
IOUtils.copy(taris, out);
out.close();
//如果是gz文件进行递归解压
if (entryFile.getName().endsWith(".gz")) {
deCompressGZipFile(entryFile.getPath(), destDir);
}
}
}
//如果需要刪除之前解压的gz文件,在这里进行
} catch (Exception e) {
LOGGER.warn("decompress failed", e);
}
}
public static void checkFileExists(File file) {
//判断是否是目录
if (file.isDirectory()) {
if (!file.exists()) {
file.mkdir();
}
} else {
//判断父目录是否存在,如果不存在,则创建
if (file.getParentFile() != null && !file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
工具类依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.19</version>
</dependency>