Java中解压缩文件的方法详解(通用)

 更新时间:2024年06月08日 09:10:02   作者:丿BAIKAL巛  
在软件开发和数据处理领域,文件的解压缩和压缩是常见的任务,下面这篇文章主要给大家介绍了关于Java中解压缩文件的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

如何实现一个上传压缩包,然后将压缩包进行解压?

下面我们就来实现一下这个代码。

最终实现的效果:

上传一个压缩包文件,会将压缩包文件下载到本地,然后再将压缩包解压到同目录下的extracted文件夹下。

在这里插入图片描述

这是压缩包内的文件,三张图片

在这里插入图片描述

一、使用的技术

使用的是Java自带的java.util.zip.ZipFile包。

java.util.zip.ZipFile 是 Java 中用于处理 ZIP 文件的类。它提供了读取 ZIP 文件内容的功能,允许你以编程方式从 ZIP 文件中提取文件和目录结构,以及读取其中的数据。

下面是一些 ZipFile 类的主要特性和用法:

  • 读取 ZIP 文件内容ZipFile 允许你打开一个 ZIP 文件,并从中读取内容。你可以通过提供 ZIP 文件的路径或者 File 对象来创建一个 ZipFile 实例。

  • 访问 ZIP 文件中的条目(entries): 一旦你打开了一个 ZIP 文件,你可以通过 entries() 方法获取 ZIP 文件中的所有条目。每个条目代表 ZIP 文件中的一个文件或目录。

  • 提取文件内容: 通过 getInputStream() 方法,你可以从 ZIP 文件中提取特定文件的内容。这个方法返回一个 InputStream 对象,你可以使用它来读取文件的数据。

  • 关闭 ZIP 文件: 使用 close() 方法关闭 ZipFile 实例,释放相关资源。

二、实际用法

实际使用的时候是从前端上传压缩包文件,然后后端接收。(具体参考后文Contrller中的完整代码逻辑)

1、上传的一般都是MultipartFile类型,需要先将MultipartFile类型转为File类型,使用FileUtils.copyInputStreamToFile这个方法。

2、转换为File类型时就需要先将文件存到本地,所以在这里指定了一个压缩包的文件路径File fileTemp = new File("D:\\unzipTest\\Test.zip");

3、使用getAbsolutePath方法来获取这个路径,将压缩包的本地路径传给fileUncompressing文件解压缩方法即可完成解压。

4、在文件解压缩方法中,会将文件解压到D:\\unzipTest\\extracted这个目录下,可以自行修改,也可以作为一个参数传进去。

我这里解压缩的时候获取了某个固定文件类型的文件路径集合,如果需要在解压缩的时候做逻辑处理,可以参考。如果只是单纯的解压缩,可以把这个逻辑删掉。

        //要下载到的本地临时文件路径
        File fileTemp = new File("D:\\unzipTest\\Test.zip");
        File parentFolder = fileTemp.getParentFile();
        //如果父文件夹(unzipTest)不存在则创建
        if(!parentFolder.exists()){
            //创建父文件夹及其所有上级文件夹
            parentFolder.mkdir();
        }
        //MultipartFile转File
        org.apache.commons.io.FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), fileTemp);

        //压缩包文件路径
        String zipFilePath = fileTemp.getAbsolutePath();
        fileUncompressing(zipFilePath);

三、文件解压缩方法(通用)

 /**
     * 文件解压缩
     * @return
     */
    public static List<String> fileUncompressing(String zipFilePath){
        String targetFolder = "D:\\unzipTest\\extracted";
        //文件名后缀
        String ncLastName=".nc";
        List<String> pathList=new ArrayList<>();

        try {
            // 创建目标文件夹
            File targetDir = new File(targetFolder);
            targetDir.mkdirs();

            // 打开压缩文件
//            ZipFile zipFile = new ZipFile(zipFilePath);
            ZipFile zipFile = new ZipFile(zipFilePath, Charset.forName("gbk"));

            // 遍历压缩文件中的所有条目
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while (entries.hasMoreElements()) {
                ZipEntry entry = entries.nextElement();

                // 解压缩条目到目标文件夹
                String entryName = entry.getName();
                entryName = new String(entryName.getBytes(Charset.forName("gbk")));
                File entryFile = new File(targetDir, entryName);

                if (entry.isDirectory()) {
                    entryFile.mkdirs();
                } else {
                    entryFile.getParentFile().mkdirs();
                    InputStream inputStream = zipFile.getInputStream(entry);
                    OutputStream outputStream = new FileOutputStream(entryFile);
                    byte[] buffer = new byte[1024];
                    int length;
                    while ((length = inputStream.read(buffer)) > 0) {
                        outputStream.write(buffer, 0, length);
                    }
                    outputStream.close();
                    inputStream.close();
                }

                //判断文件是否是.nc结尾
                if (entryName.endsWith(ncLastName)) {
                    // 拼接路径
                    Path path = Paths.get(targetFolder, entryName);
                    pathList.add(path.toString());
                }
            }

            // 关闭压缩文件
            zipFile.close();

//            log.info("文件读取完成");
            System.out.println("文件读取完成");

        } catch (ZipException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return pathList;
    }

四、完整代码逻辑

@RestController
@RequestMapping("/practice")
public class PracticeController extends BaseController
{

    @PostMapping("/list")
    public TableDataInfo list(MultipartFile multipartFile) throws IOException {
        //要下载到的本地临时文件路径
        File fileTemp = new File("D:\\unzipTest\\Test.zip");
        File parentFolder = fileTemp.getParentFile();
        //如果父文件夹(unzipTest)不存在则创建
        if(!parentFolder.exists()){
            //创建父文件夹及其所有上级文件夹
            parentFolder.mkdir();
        }
        //MultipartFile转File
        org.apache.commons.io.FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), fileTemp);

        //压缩包文件路径
        String zipFilePath = fileTemp.getAbsolutePath();
        fileUncompressing(zipFilePath);


        startPage();
        List<StudentScores> list = new ArrayList<>();
        return getDataTable(list);
    }



    /**
     * 文件解压缩
     * @return
     */
    public static List<String> fileUncompressing(String zipFilePath){
//        String zipFilePath = "D:\\unzipTest\\ERA5.zip";
        String targetFolder = "D:\\unzipTest\\extracted";
        //文件名后缀
        String ncLastName=".nc";
        List<String> pathList=new ArrayList<>();

        try {
            // 创建目标文件夹
            File targetDir = new File(targetFolder);
            targetDir.mkdirs();

            // 打开压缩文件
//            ZipFile zipFile = new ZipFile(zipFilePath);
            ZipFile zipFile = new ZipFile(zipFilePath, Charset.forName("gbk"));

            // 遍历压缩文件中的所有条目
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while (entries.hasMoreElements()) {
                ZipEntry entry = entries.nextElement();

                // 解压缩条目到目标文件夹
                String entryName = entry.getName();
                entryName = new String(entryName.getBytes(Charset.forName("gbk")));
                File entryFile = new File(targetDir, entryName);

                if (entry.isDirectory()) {
                    entryFile.mkdirs();
                } else {
                    entryFile.getParentFile().mkdirs();
                    InputStream inputStream = zipFile.getInputStream(entry);
                    OutputStream outputStream = new FileOutputStream(entryFile);
                    byte[] buffer = new byte[1024];
                    int length;
                    while ((length = inputStream.read(buffer)) > 0) {
                        outputStream.write(buffer, 0, length);
                    }
                    outputStream.close();
                    inputStream.close();
                }

                //判断文件是否是.nc结尾
                if (entryName.endsWith(ncLastName)) {
                    // 拼接路径
                    Path path = Paths.get(targetFolder, entryName);
                    pathList.add(path.toString());
                }
            }

            // 关闭压缩文件
            zipFile.close();

//            log.info("文件读取完成");
            System.out.println("文件读取完成");

        } catch (ZipException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return pathList;
    }
}

总结 

到此这篇关于Java中解压缩文件的方法详解的文章就介绍到这了,更多相关Java解压缩文件方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中synchronized(同步代码块和同步方法)详解及区别

    java中synchronized(同步代码块和同步方法)详解及区别

    这篇文章主要介绍了 java中synchronized(同步代码块和同步方法)详解及区别的相关资料,需要的朋友可以参考下
    2017-02-02
  • SpringBoot集成Redis流程详解

    SpringBoot集成Redis流程详解

    这篇文章主要介绍了SpringBoot集成Redis流程详解,导入jar包,编写配置类,编写util类,配置yml这四个步骤,有详细的代码示例,,需要的朋友可以参考下
    2023-05-05
  • Springboot如何设置过滤器及重复读取request里的body

    Springboot如何设置过滤器及重复读取request里的body

    这篇文章主要介绍了Springboot如何设置过滤器及重复读取request里的body,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 2020macOS Big Sur配置Java开发环境之jdk安装过程

    2020macOS Big Sur配置Java开发环境之jdk安装过程

    这篇文章主要介绍了2020macOS Big Sur配置Java开发环境之jdk安装,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • springboot整合mybatis实现简单的一对多级联查询功能

    springboot整合mybatis实现简单的一对多级联查询功能

    这篇文章主要介绍了springboot整合mybatis实现简单的一对多级联查询功能,分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Java BigDecimal解决double精度丢失的问题

    Java BigDecimal解决double精度丢失的问题

    我们在日常开发中, 有很多时候会遇到小数(double类型)精确计算,本文主要介绍了Java BigDecimal解决double精度丢失的问题,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Spring Boot读取自定义配置文件

    Spring Boot读取自定义配置文件

    在Spring Boot项目中我们经常需要读取application.yml配置文件的自定义配置,今天就来罗列一下从yaml读取配置文件的一些常用手段和方法。
    2021-05-05
  • AQS同步组件CyclicBarrier循环屏障用例剖析

    AQS同步组件CyclicBarrier循环屏障用例剖析

    这篇文章主要为大家介绍了AQS同步组件CyclicBarrier循环屏障用例剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • spring security登录成功后跳转回登录前的页面

    spring security登录成功后跳转回登录前的页面

    这篇文章主要介绍了spring security登录成功后跳转回登录前的页面,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 在springboot中如何使用线程池

    在springboot中如何使用线程池

    在SpringBoot中,可以通过定义ThreadPoolTaskExecutor的Bean并使用@Autowired注入来使用线程池,具体步骤包括创建ThreadPoolTaskExecutor的Bean配置,本文给大家介绍springboot使用线程池的例子,感兴趣的朋友跟随小编一起看看吧
    2024-09-09

最新评论