Java解压zip及rar

项目使用当中遇到的吭

1:rar格式压缩包仅支持WINRAR5以下的,如果是WINRAR5+ 那么FileHeaders获取的size就为0;

2:因为用的是springboot所以本地文件夹获取不到路径,因为最终要打成jar包运行在服务器的(获取项目路径本地是可以的,但是在linux上会出现找不到路径)

3:文件夹传统方式的也是无法删除(技术有限)

package com.isky.dataservice.utils;


import java.io.File;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import com.isky.common.utils.StringUtil;
import com.isky.dataservice.utils.enums.CommonEnum;
import org.springframework.web.multipart.MultipartFile;

/**
 * 解压文件包(zip和rar格式)
 * @param file
 */
public class UploadUtil {

    public static String path = "/home/asserts";

    /**
     * 解析上传的压缩文件
     *
     * @param file 上传文件
     * @return
     * @throws Exception
     */
    public static Set<Integer> resolveCompressUploadFile(MultipartFile file) throws Exception {
        String[] pics = {"jpg", "jpeg", "png", "psd", "gif", "bmp", "tiff", "cdr", "svg"};
        String[] files = {"pdf", "txt", "text", "xlsx", "xls", "docx", "doc", "json", "xml", "csv", "rar", "zip"};
        String[] videos = {"ape", "ra", "wma", "mp3", "mp4", "wmv", "vob", "mkv", "mpe", "mpeg", "mpg", "divx", "avi", "rmvb", "rm", "asf", "mov", "flv", "3gp"};
        Map<String, String> map = null;
        if (file.isEmpty()) {
            throw new Exception(CommonEnum.FILE_NOT_NULL.getName());
        }
        String fileName = file.getOriginalFilename();
        int pos = fileName.lastIndexOf(".");
        //获取后缀名
        String extName = fileName.substring(pos + 1).toLowerCase();

        HashSet<Integer> set = new HashSet<>();

        if (extName.equals("zip") || extName.equals("rar")) {
            String saveName = StringUtil.getUUID() + "." + extName;
            String saveFileName = saveName.substring(0, saveName.lastIndexOf("."));
            // 根据服务器的文件保存地址和原文件名创建目录文件全路径
            File pushFile = new File(path + "/" + saveFileName + "/" + saveName);
            File descFile = new File(path + "/" + saveFileName);
            if (!descFile.exists()) {
                descFile.mkdirs();
            }
            //解压目的文件
            String descDir = path + "/" + saveFileName + "/";
            file.transferTo(pushFile);
            if (extName.equals("zip")) {
                map = CompressFileUtils.unZipFiles(pushFile, descDir);
            } else {
                map = CompressFileUtils.unRarFile(pushFile.getAbsolutePath(), descDir);
            }
            Set<String> strings = map.keySet();

            outer:
            for (String str : strings) {

                for (int i = 0; i < pics.length; i++) {
                    if (str.equalsIgnoreCase(pics[i])) {
                        set.add(3);
                        continue outer;
                    }
                }

                for (int i = 0; i < videos.length; i++) {
                    if (str.equalsIgnoreCase(videos[i])) {
                        set.add(5);
                        continue outer;
                    }
                }

                for (int i = 0; i < files.length; i++) {
                    if (str.equalsIgnoreCase(files[i])) {
                        set.add(4);
                        continue outer;
                    }
                }
                set.add(99);
            }
            if (descFile.exists()) {

                deleteAllFilesOfDir(descFile);

                descFile.delete();

            }
            return set;
        }

        for (String str : pics) {
            if (extName.equalsIgnoreCase(str)) {
                set.add(3);
                return set;
            }
        }

        for (String str : videos) {
            if (extName.equalsIgnoreCase(str)) {
                set.add(5);
                return set;
            }
        }

        for (String str : files) {
            if (extName.equalsIgnoreCase(str)) {
                set.add(4);
                return set;
            }
        }

        set.add(99);
        return set;
    }

    public static void deleteAllFilesOfDir(File path) {
        if (null != path) {
            if (!path.exists()) {
                return;
            }
            if (path.isFile()) {
                boolean result = path.delete();
                int count = 0;
                while (!result && count++ < 10) {
                    System.gc();
                    result = path.delete();
                }
            }
            File[] files = path.listFiles();
            if (null != files) {
                for (File f : files) {
                    deleteAllFilesOfDir(f);
                }
            }
            path.delete();
        }
    }
}

  

package com.isky.dataservice.utils;

import java.io.*;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

/**
 * @author Administrator
 */
public class CompressFileUtils {
    /**
     * 解压文件到指定目录
     *
     * @param zipFile
     * @param descDir
     */
    @SuppressWarnings("rawtypes")
    public static Map<String, String> unZipFiles(File zipFile, String descDir) throws IOException {
        Map<String, String> map = new HashMap<>();
        File pathFile = new File(descDir);
        if (!pathFile.exists()) {
            pathFile.mkdirs();
        }
        ZipFile zip = new ZipFile(zipFile, "gbk");
        for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) {
            ZipEntry entry = (ZipEntry) entries.nextElement();
            String zipEntryName = entry.getName();
            //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
            if (entry.isDirectory()) {
                continue;
            }

            int i = zipEntryName.lastIndexOf(".");
            String sbu = zipEntryName.substring(i + 1);
            map.put(sbu, "1");
        }
        return map;
    }

    /**
     * 根据原始rar路径,解压到指定文件夹下.
     *
     * @param srcRarPath       原始rar路径
     * @param dstDirectoryPath 解压到的文件夹
     */
    public static Map<String, String> unRarFile(String srcRarPath, String dstDirectoryPath) throws Exception {
        Map<String, String> map = new HashMap<>();
        FileOutputStream os = null;
        File dstDiretory = new File(dstDirectoryPath);
        if (!dstDiretory.exists()) {
            dstDiretory.mkdirs();
        }
        Archive a = null;
        a = new Archive(new File(srcRarPath));
        if (a != null) {
            FileHeader fh = a.nextFileHeader();
            while (fh != null) {
                if (fh.isDirectory()) {
                    File fol = new File(dstDirectoryPath + File.separator
                            + fh.getFileNameString());
                    fol.mkdirs();
                } else {
                    File out = new File(dstDirectoryPath + File.separator
                            + fh.getFileNameString().trim());
                    String fileName = fh.getFileNameString().trim();
                    String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
                    map.put(fileType, "1");

                    if (!out.exists()) {
                        if (!out.getParentFile().exists()) {
                            out.getParentFile().mkdirs();
                        }
                        out.createNewFile();
                    }
                    os = new FileOutputStream(out);
                    a.extractFile(fh, os);
                }
                fh = a.nextFileHeader();
            }
        }
        if(os != null){
            os.close();
        }
        if(a != null){
            a.close();
        }
        return map;
    }
}

  

原文地址:https://www.cnblogs.com/appc/p/11102629.html