1 问题
使用Java 代码实现,压缩东西到.tar.gz文件里面,或者使用代码解压.tar.gz文件
2 实现(工具类)
代码语言:javascript复制import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarInputStream;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
/**
* 把一个目录下的所有文件和文件夹打成.tar.gz包(从当前的目录开始)
* @time 16:15
* @discription
**/
@Slf4j
public class TarUtil {
// private static void main(String[] args) throws IOException {
/**
* 把多个文件夹打成.tar.gz包(从当前的目录开始)
* @param sourceFolder 需要打成.tar.gz包的目录列表(包含目录和目录下的所有文件和文件夹)
* @param tarGzPath 打成的tar包生成的目标目录 例: D:/tmp 最终打包会在 D:/tmp目录下生成 test.tar.gz包
* @param tarGzFileName 打tar.gz包的名,例如:ide-sdk.tar.gz
*/
public static void fileListToTar(List<String> sourceFolder, String tarGzPath, String tarGzFileName) {
TarArchiveOutputStream tarOs = null;
try {
// 遍历每一个文件的绝对路径
for(String folder : sourceFolder){
if(folder.contains("../")){
throw new FileNotFoundException("压缩的目录不存在。。。");
}
File sourceFile = new File(folder);
if (!sourceFile.exists()) {
throw new FileNotFoundException("压缩的目录不存在。。。");
}
}
// 压缩包流
tarOs = createTar(tarGzPath,tarGzFileName,tarOs);
// 遍历每一个文件的绝对路径
for(String folder : sourceFolder){
addFileListToTarGZ(folder, tarOs);
}
} catch (IOException e) {
log.info(e.getMessage());
} finally {
try {
tarOs.close();
} catch (IOException e) {
log.info(e.getMessage());
}
}
}
/**
* 把文件复制到.tar.gz包中
* @param sourceFile 需要复制的文件路径
* @param tarArchive tar包流
* @throws IOException 异常
*/
private static void addFileListToTarGZ(String sourceFile, TarArchiveOutputStream tarArchive)
throws IOException {
// 原文件绝对路径
if(sourceFile.contains("../")){
throw new FileNotFoundException("文件不存在。。。");
}
File file = new File(sourceFile);
String parent = file.getParent();
// String entryName = parent File.separator file.getName();
String entryName = file.getName();
// 添加 tar ArchiveEntry
tarArchive.putArchiveEntry(new TarArchiveEntry(file, entryName));
if (file.isFile()) {
FileInputStream fis = new FileInputStream