使用Java 代码实现,压缩东西到.tar.gz文件里面,或者使用代码解压.tar.gz文件

2023-11-02 08:56:02 浏览数 (2)

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

0 人点赞