java解压各种格式压缩文件

最近碰到需要解析各类压缩包并入库的需求,废话不多说直接上代码

package com.anylangtech.corpus.utils;

import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.rarfile.FileHeader;
import lombok.Cleanup;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.utils.IOUtils;
import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;


public class UncompressionUtils {


    /**
      * @description: 解压zip文件
      * @param [zipPath, descDir]
      * @return void
      * @author wrt
      * @date 2022/4/7 15:00
      */
    public static void unZipFile(String zipPath, String descDir) {
        try {
            File zipFile = new File(zipPath);
            if (!zipFile.exists()) {
                throw new IOException("需解压文件不存在.");
            }
            File pathFile = new File(descDir);
            if (!pathFile.exists()) {
                pathFile.mkdirs();
            }
            ZipFile zip = new ZipFile(zipFile, Charset.forName("GBK"));
            int count = 0;
            for (Enumeration entries = zip.entries(); entries.hasMoreElements(); ) {
                ZipEntry entry = (ZipEntry) entries.nextElement();
                //避免文件名过长超出linux文件名长度限制255
                String zipEntryName;
                if(entry.getName().length() > 50){
                    zipEntryName = entry.getName().substring(0,50) + count + entry.getName().substring(entry.getName().lastIndexOf("."));
                } else {
                    zipEntryName = entry.getName();
                }
                InputStream in = zip.getInputStream(entry);
                String outPath = (descDir + File.separator + zipEntryName).replaceAll("\\*", "/");
                // 判断路径是否存在,不存在则创建文件路径
                File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
                if (!file.exists()) {
                    file.mkdirs();
                }
                // 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
                if (new File(outPath).isDirectory()) {
                    continue;
                }
                // 输出文件路径信息
                OutputStream out = new FileOutputStream(outPath);
                byte[] buf1 = new byte[1024];
                int len;
                while ((len = in.read(buf1)) > 0) {
                    out.write(buf1, 0, len);
                }
                in.close();
                out.close();
                count++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
      * @description: 解压rar文件
      * @param [srcRarPath, dstDirectoryPath]
      * @return void
      * @author wrt
      * @date 2022/4/7 15:03
      */
    public static void unRarFile(String rarPath, String descDir) {
        File outFile = new File(descDir);
        // 目标目录不存在时,创建该文件夹
        if (!outFile.exists()) {
            outFile.mkdirs();
        }
        try {
            @Cleanup Archive archive = new Archive(new FileInputStream(rarPath));
            FileHeader fileHeader = archive.nextFileHeader();
            while (fileHeader != null) {
                // 解决中文乱码问题【压缩文件中文乱码】
                String fileName = fileHeader.getFileNameW().isEmpty() ? fileHeader.getFileNameString() : fileHeader.getFileNameW();
                // 文件夹
                if (fileHeader.isDirectory()) {
                    File fol = new File(descDir + File.separator + fileName.trim());
                    fol.mkdirs();
                } else { // 文件
                    // 解决linux系统中\分隔符无法识别问题
                    String[] fileParts = fileName.split("\\\\");
                    StringBuilder filePath = new StringBuilder();
                    for (String filePart : fileParts) {
                        filePath.append(filePart).append(File.separator);
                    }
                    fileName = filePath.substring(0, filePath.length() - 1);
                    File out = new File(descDir + File.separator + fileName.trim());
                    if (!out.exists()) {
                        // 相对路径可能多级,可能需要创建父目录.
                        if (!out.getParentFile().exists()) {
                            out.getParentFile().mkdirs();
                        }
                        out.createNewFile();
                    }
                    @Cleanup FileOutputStream os = new FileOutputStream(out);
                    archive.extractFile(fileHeader, os);
                }
                fileHeader = archive.nextFileHeader();
            }
        } catch (IOException | RarException e) {
            e.printStackTrace();
        }
    }

    /**
      * @description: 解压tar文件
      * @param [inputStream, unTarPath]
      * @return void
      * @author wrt
      * @date 2022/4/7 15:03
      */
    public static void unTarFile(InputStream inputStream, String descDir) {
        FileInputStream fis = null;
        try (TarArchiveInputStream tis = new TarArchiveInputStream(inputStream)) {
            TarArchiveEntry nte = null;
            while ((nte = tis.getNextTarEntry()) != null) {
                String dir = descDir + File.separator + nte.getName();
                FileOutputStream fos = null;
                BufferedOutputStream bos = null;
                try {
                    if (nte.isDirectory()) {
                        File file1 = new File(dir);
                        file1.mkdirs();
                    } else {
                        File file2 = new File(dir);
                        fos = new FileOutputStream(file2);
                        bos = new BufferedOutputStream(fos);
                        IOUtils.copy(tis, bos);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (bos != null) {
                        bos.close();
                    }
                    if (fos != null) {
                        fos.close();
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @description: 获取文件夹下所有文件
     * @param [obj]
     * @return java.util.List<java.io.File>
     * @author wrt
     * @date 2022/4/7 15:31
     */
    public static List<File> getListFiles(Object obj) {
        File directory = null;
        if (obj instanceof File) {
            directory = (File) obj;
        } else {
            directory = new File(obj.toString());
        }
        ArrayList<File> files = new ArrayList<File>();
        if (directory.isFile()) {
            files.add(directory);
            return files;
        } else if (directory.isDirectory()) {
            File[] fileArr = directory.listFiles();
            for (int i = 0; i < fileArr.length; i++) {
                File fileOne = fileArr[i];
                files.addAll(getListFiles(fileOne));
            }
        }
        return files;
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值