• java 压缩包 遍历解压 zip 和 7z 指定格式文件


    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
    import org.apache.commons.compress.archivers.sevenz.SevenZFile;
    
    import java.io.*;
    import java.nio.charset.Charset;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.Enumeration;
    import java.util.concurrent.*;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    
    /**
     * zip文件解压
     * @author fhadmin
     * @from www.fhadmin.cn
     */
    @Slf4j
    public class ZipUtils {
        public static void main(String[] args) throws IOException {
    //        ZipHandler zipHandler = new ZipHandler();
    //        zipHandler.decompress("F:/test.zip", "F:/test/");
            String filePath = "C:\\Users\\260481\\Desktop\\1ORIGIN_DATA_LIST_1610090555026_spark9.zip";
            File fil = new File(filePath);
            InputStream fileInputStream = new FileInputStream(fil);
            Path path = Paths.get("business","src", "main", "resources", "static", "1ORIGIN_DATA_LIST_1610615443346_测试.zip");
            File file1 = path.getParent().toFile();
            if (!file1.exists()){
                file1.mkdirs();
            }
            Files.copy(fileInputStream,path);
            File file = path.toFile();
            ZipUtils zipHandler = new ZipUtils();
            Path path1 = Paths.get("business","src", "main", "resources", "static");
            zipHandler.decompress(file,path1.toString());
        }
    
    //解压方法
        public  void decompress(File srcFile, String destDirPath){
            //判断是zip格式 还是 7z格式
            if (srcFile.getName().toLowerCase().endsWith(".zip")){
                    try {
                        decompressZIP(srcFile, destDirPath);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            }else if (srcFile.getName().toLowerCase().endsWith(".7z")){
                   try {
                        decompress7Z(srcFile, destDirPath);
                   } catch (Exception e) {
                       e.printStackTrace();
                   }
            }
    //解压完成后,删除压缩包方法,以及空文件夹
            File parentFile = srcFile.getParentFile();
            boolean delete = srcFile.delete();
            if (!delete){
                log.error("删除文件"+srcFile.getName()+"失败");
            }
            if (parentFile.isDirectory() && (parentFile.listFiles() == null || parentFile.listFiles().length<=0)){
                log.info("删除文件夹"+parentFile.getName()+parentFile.delete());
            }
        }
    
        private  void decompress7Z(File srcFile, String destDirPath) throws Exception {
            /**
             * zip解压
             * @param inputFile 待解压文件名
             * @param destDirPath  解压路径
             */
    //        File srcFile = new File(inputFile);//获取当前压缩文件
            // 判断源文件是否存在
            if (!srcFile.exists()) {
                throw new Exception(srcFile.getPath() + "所指文件不存在");
            }
            //开始解压
            long start = System.currentTimeMillis();
            SevenZFile zIn = new SevenZFile(srcFile);
            SevenZArchiveEntry entry = null;
            File file = null;
            while ((entry = zIn.getNextEntry()) != null) {
                if (!entry.isDirectory()) {
    
                    String name = entry.getName();
                    
                    file = new File(destDirPath, name);
                    saveFile(zIn, file,destDirPath);
    
                }
            }
    
            zIn.close();
            long end = System.currentTimeMillis();
            log.info("解压"+srcFile.getName()+"耗时"+(end-start)+"毫秒");
        }
    
        private void saveFile(SevenZFile zIn, File file, String destDirPath) {
    
            String toLowerCase = file.getName().toLowerCase();
            //校验文件后缀
            if (!file.exists() &&  (verifySuffix(toLowerCase) || toLowerCase.endsWith(".zip")|| toLowerCase.endsWith(".7z"))) {
                new File(file.getParent()).mkdirs();//创建此文件的上级目录
                try(OutputStream out = new FileOutputStream(file);
                    BufferedOutputStream bos = new BufferedOutputStream(out);) {
    
    
                    int len = -1;
                    byte[] buf = new byte[1024];
                    while ((len = zIn.read(buf)) != -1) {
                        bos.write(buf, 0, len);
                    }
    
                } catch (IOException e) {
                    log.error(file.getName() + "文件创建失败");
                }
    
                if (file.getName().endsWith(".7z") || file.getName().endsWith(".zip")){
                    try {
                        decompress(file, destDirPath);
    //                            boolean delete = file.delete();
    //                            System.out.println("文件删除"+delete);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
    
            } else {
    //            file = new File(file.getParent(), "(1)" + file.getName());
    //            saveFile(zIn, file, destDirPath);
            }
        }
    
        private void decompressZIP(File file, String destPath) throws IOException {
    
            long start = System.currentTimeMillis();
    
    
            ZipFile zipFile = new ZipFile(file, Charset.forName("GBK"));
    
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            //使用线程池 提交任务  没有工具类 可自己new
            ExecutorService threadPool = ThreadPoolUtil.getInstance();
            int size = zipFile.size();
            final CountDownLatch countDownLatch = new CountDownLatch(size);
            while (entries.hasMoreElements()) {
                ZipEntry zipEntry = entries.nextElement();
                if (zipEntry.isDirectory()) {
                    countDownLatch.countDown();
                    continue;
                }
                threadPool.execute(new FileWritingTask(zipFile,destPath,zipEntry,countDownLatch));
            }
    //        threadPool.shutdown();
            try {
    //            threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
          countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            zipFile.close();
            long end = System.currentTimeMillis();
            log.info("解压"+file.getName()+"耗时"+(end-start)+"毫秒");
    //        boolean delete = file.delete();
    //        if (!delete){
    //            log.error("删除文件"+file.getName()+"失败");
    //        }
    
    
        }
    
        public static boolean verifySuffix(String name) {
            String lowerCase = name.toLowerCase();
            if (lowerCase.endsWith(".jpg") || lowerCase.endsWith(".jpeg") || lowerCase.endsWith(".png") || lowerCase.endsWith(".bmp")){
                return true;
            }else {
                return false;
            }
        }
    
        private class FileWritingTask implements Runnable {
            private ZipFile zipFile;
    
            private String destPath;
            private ZipEntry zipEntry;
            private CountDownLatch countDownLatch;
                FileWritingTask(ZipFile zipFile, String destPath, ZipEntry zipEntry, CountDownLatch countDownLatch) {
                this.zipFile = zipFile;
                this.destPath = destPath;
                this.zipEntry = zipEntry;
                this.countDownLatch = countDownLatch;
            }
    
            @Override
            public void run() {
                try {
                    String name = zipEntry.getName();
                    String lowerCaseName = name.toLowerCase();
                    if (verifySuffix(lowerCaseName)|| lowerCaseName.endsWith(".zip")|| lowerCaseName.endsWith(".7z")){
                        //保留层级目录 解决文件重名问题
    //                    if (name.lastIndexOf("/")!=-1) {
    //                        name = name.substring(name.lastIndexOf("/")+1);
    //                    }
                        File file = new File(destPath + File.separator + name);
                        while(!file.exists() ){
    //                        file=new File(destPath+File.separator+"(1)"+name);
                            File parentFile = file.getParentFile();
                            if (!parentFile.exists()) {
                                parentFile.mkdirs();
                            }
                            try {
                                InputStream inputStream = zipFile.getInputStream(this.zipEntry);
    //                            Path path = Paths.get(parentFile.getPath() + File.separator + name);
    //File file1 = new File(path.toString());
                                while (!file.exists()) {
                                    Files.copy(inputStream,Paths.get(file.getPath()));
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            //判断如果是压缩包 递归解压
                            if (lowerCaseName.endsWith(".zip")|| lowerCaseName.endsWith(".7z")){
                                String s = destPath + File.separator + name;
                                File file1 = new File(s);
                                decompress(file1,destPath);
                            }
                        }
    
                    }
                }finally {
                    countDownLatch.countDown();
                }
            }
        }
    }
  • 相关阅读:
    sys模块详解
    os模块详解2
    tyvj 1203 机器分配
    洛谷 P1496 火烧赤壁
    P1204 [USACO1.2]挤牛奶Milking Cows
    bzoj 2120 数颜色
    P2056 采花
    P1972 [SDOI2009]HH的项链
    9.20模拟赛
    P2709 小B的询问
  • 原文地址:https://www.cnblogs.com/teacher11/p/15010306.html
Copyright © 2020-2023  润新知