zoukankan      html  css  js  c++  java
  • 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();
                }
            }
        }
    }
  • 相关阅读:
    HOJ 2139 Spiderman's workout(动态规划)
    FZU 2107 Hua Rong Dao(dfs)
    Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节
    Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节
    Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节
    Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
    Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
    Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
    Java 第十一届 蓝桥杯 省模拟赛 无向连通图最少包含多少条边
    Java 第十一届 蓝桥杯 省模拟赛 无向连通图最少包含多少条边
  • 原文地址:https://www.cnblogs.com/teacher11/p/15010306.html
Copyright © 2011-2022 走看看