`
m17197092417
  • 浏览: 22675 次
文章分类
社区版块
存档分类
最新评论

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();
            }
        }
    }
}

 

分享到:
评论

相关推荐

    Java中递归逻辑循环调用解压zip里面所有的压缩包

    Java中递归逻辑循环调用解压zip里面所有的压缩包 Java中递归逻辑循环调用解压zip里面所有的压缩包

    java将文件夹压缩成zip,解压zip压缩包

    解压ZIP文件的过程相对简单,主要使用`ZipInputStream`和`FileOutputStream`。以下是解压的基本步骤: 1. **创建`ZipInputStream`**:使用`FileInputStream`打开ZIP文件,然后传递给`ZipInputStream`。 2. **读取`...

    JAVA解压ZIP格式的压缩包_java解压缩_zip_

    在给定的压缩包文件中,包含了一个名为"JAVA解压ZIP格式的压缩包.docx"的文档,这可能是对解压过程的详细说明或补充信息。在实际操作中,你可以将上述代码与这个文档结合,以获得更深入的理解和实践指导。

    JAVA解压缩ZIP或RAR格式的文件

    首先,对于ZIP格式的文件,Java标准库提供了`java.util.zip`包,其中的`ZipInputStream`和`ZipOutputStream`类可以用来读取和写入ZIP文件。以下是解压缩ZIP文件的基本步骤: 1. 创建一个`FileInputStream`对象,...

    java解压zip 可包含中文文件

    下面是一个使用Java标准库解压ZIP文件的例子,同时处理中文文件名: ```java import java.io.*; import java.nio.charset.StandardCharsets; import java.util.zip.*; public class ZipExtractor { public static...

    Java从压缩包中提取文件.7z

    在Java编程环境中,处理压缩文件是一项常见的任务,例如解压包含多个文件的.7z压缩包。7z是一种高效的数据压缩格式,由7-Zip软件创建。为了在Java中实现这个功能,我们需要依赖一个第三方库,如Apache Commons ...

    Java从压缩包中提取文件Demo源码.zip

    在Java编程语言中,处理压缩文件,如ZIP格式,是一项常见的任务。...通过这个Demo源码,开发者可以学习到如何读取ZIP文件,遍历其条目,并将条目内容解压到指定的输出目录。这在软件开发中是非常基础且实用的技能。

    下载压缩包并解压到指定文件夹

    - 解压过程:通过库提供的API,你可以打开压缩包,遍历其中的文件,然后将每个文件解压到指定的目录。通常需要提供源压缩文件路径和目标解压目录。 现在,我们来看描述中提到的“只设置两个路径”。这两个路径分别...

    Zip压缩和解压文件

    以下是一个解压Zip文件到指定目录的Java代码片段: ```java import java.io.*; import java.util.zip.*; public class ZipUtil { public static void unzipFile(String zipFile, String destDirectory) { try ...

    JAVA解压缩ZIP压缩文件(含中文名文件)完整DEMO

    在Java编程环境中,...这个DEMO涵盖了Java解压ZIP文件的基本流程,包括处理中文文件名。通过这个DEMO,开发者可以更好地理解和实践Java在处理压缩文件时的细节。记得在实际项目中根据需求进行适当的错误处理和优化。

    java压缩包解压

    我们主要使用`ZipInputStream`和`ZipEntry`来读取和解压ZIP文件。以下是一个基本的解压ZIP文件的示例: ```java import java.io.*; import java.util.zip.*; public class ZipDecompressor { public static void ...

    纯java实现文件的解压,压缩,可以分别解压/压缩 单条,多条,文件,文件夹

    解压ZIP文件则需要使用`ZipInputStream`。以下是一个基本的解压方法: ```java import java.io.*; import java.util.zip.*; public class Unzipper { public static void unzipFile(String zipFilePath, String ...

    基于Java的从压缩包中提取文件.zip

    除了基础的解压缩功能,Java还允许我们处理更复杂的情况,如密码保护的ZIP文件、自解压的ZIP文件以及包含其他压缩格式(如GZIP或BZIP2)的ZIP条目。此外,还可以使用第三方库,如Apache Commons Compress或Google's ...

    基于java的从压缩包中提取文件.zip

    在Java编程环境中,处理压缩文件,如ZIP格式的文件,是一项常见的任务。本文将深入探讨如何使用Java API来实现从ZIP压缩包中提取文件。Java标准库提供了`java.util.zip`包,它包含了处理各种压缩格式(如ZIP、GZ等)...

    android ZIP文件的解压

    ZIP是一种广泛使用的文件格式,它允许将多个文件和目录打包成一个单一的文件,便于存储和传输。以下是对ZIP文件解压的详细解释。 1. **ZIP文件结构** ZIP文件是一个二进制格式,包含一个或多个文件和/或目录的列表...

    java 解压zip包

    本篇文章将深入探讨如何使用Java技术有效地解压ZIP压缩包,并获取流信息。 首先,我们需要了解Java中用于处理ZIP文件的核心类:`java.util.zip.ZipInputStream`和`java.util.zip.ZipEntry`。`ZipInputStream`是从...

    JAVA压缩包加密解密方法及jar包

    首先,我们需要引入`zip.jar`这个库,它包含了处理ZIP文件格式所需的类。`java.util.zip`包提供了如`ZipOutputStream`和`ZipInputStream`等类,用于创建和读取ZIP文件。这些类可以让我们方便地进行文件的压缩和解...

    Java中调用压缩库查看ZIP压缩包内容.rar

    在Java编程环境中,处理压缩文件是一项常见的任务,例如查看或操作ZIP压缩包内容。这篇讨论将专注于如何在Java中利用内置的压缩库来查看ZIP压缩包的文件内容,而不进行解压缩。由于RAR格式的处理不在Java的标准库...

    安卓Android源码——安卓Android 在线下载压缩包并解压到指定目录.zip

    Android系统本身并不提供直接解压ZIP或RAR文件的API,所以我们需要借助第三方库,如ZArchive或Apache Commons Compress。以ZArchive为例,我们可以创建一个ZipInputStream,遍历并解压每个条目: ```java ...

    基于Java的实例源码-从压缩包中提取文件.zip

    在Java编程语言中,处理压缩文件,如ZIP格式,是一项常见的任务。本实例源码着重于如何从ZIP压缩包中提取文件,这对于软件开发、数据传输或者备份操作都非常有用。以下将详细介绍Java中处理ZIP文件的基本步骤和相关...

Global site tag (gtag.js) - Google Analytics