Java 解压文件

news2024/9/22 22:36:08

maven库:

<!--FileUtil、ZipUtil 依赖-->   
<dependency>
  <groupId>cn.hutool</groupId>
  <artifactId>hutool-all</artifactId>
  <version>5.3.1</version>
</dependency>

<!--IOUtils 依赖-->
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.11.0</version>
</dependency>

<!--MockMultipartFile 依赖-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>5.0.5.RELEASE</version>
</dependency>

<!--MultipartFile 依赖-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.1.8.RELEASE</version>
</dependency>

代码:

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
import org.apache.commons.io.IOUtils;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;


public class Test {
    public static void main(String[] args) throws IOException {
        //生成File文件
        File file = new File("H:\\testFile\\123.zip");
        //File文件转MultipartFile
        FileInputStream input = new FileInputStream(file);
        MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input));

        //pdf文件名称
        List<String> pdfName = new ArrayList<>();
        //multipartFileList--存储解压后的,pdf文件
        List<MultipartFile> multipartFileList = new ArrayList<>();
        //设置解压后文件的临时路径
        String destDirPath = FileUtil.getTmpDirPath() + "/standardFile/" + +System.nanoTime() + "/";
        try {
            //解压文件
            List<File> files = parseMainTextZip(multipartFile, destDirPath);
            System.out.println("解压文件个数:"+ files.size());
            for (File filePdf : files) {
                InputStream inputStream = new FileInputStream(filePdf);
                MultipartFile multipartFileTmp = new MockMultipartFile("file", filePdf.getName(), "text/plain", IOUtils.toByteArray(inputStream));

                //multipartFileList--存储解压后的,pdf文件
                multipartFileList.add(multipartFileTmp);
                String pdfNameStr = filePdf.getName();
                pdfName.add(pdfNameStr.substring(0, pdfNameStr.length() - 4));
                inputStream.close();
            }
        }catch (Exception e) {
            e.printStackTrace();
        } finally {
            //删除临时路径中解压后的文件
            FileUtil.del(destDirPath);
        }

        //处理解压后的文件--multipartFileList
        for (MultipartFile filePdf : multipartFileList) {
            String originalFilepdf = filePdf.getOriginalFilename();
            if (originalFilepdf.endsWith("pdf")) {
                originalFilepdf = originalFilepdf.substring(0, originalFilepdf.length() - 4);
                System.out.println("文件名称为:"+originalFilepdf);
            }
        }
    }

    //解压文件
    private static List<File> parseMainTextZip(MultipartFile mainTextFile, String destDirPath) throws Exception {
        if (!FileUtil.exist(destDirPath)) {
            //创建解压后的目录
            createDirectory(destDirPath);
        }
        String tmpFilePath = destDirPath + mainTextFile.getOriginalFilename();
        File fromStream = FileUtil.writeFromStream(mainTextFile.getInputStream(), tmpFilePath);
        File zipFile;
        try {
            zipFile = ZipUtil.unzip(fromStream.getAbsolutePath(), destDirPath, Charset.forName("GBK"));
        } catch (Exception e) {
            zipFile = ZipUtil.unzip(fromStream.getAbsolutePath(), destDirPath, StandardCharsets.UTF_8);
        }
        List<File> extractedFileList = FileUtil.loopFiles(zipFile, file -> !file.getName().endsWith("zip"));
        return extractedFileList;
    }

    /**
     * 创建目录
     *
     * @param descDirName 目录名,包含路径
     * @return 如果创建成功,则返回true,否则返回false
     */
    public static boolean createDirectory(String descDirName) {
        String descDirNames = descDirName;
        if (!descDirNames.endsWith(File.separator)) {
            descDirNames = descDirNames + File.separator;
        }
        File descDir = new File(descDirNames);
        if (descDir.exists()) {
            System.out.println("目录 " + descDirNames + " 已存在!");
            return false;
        }
        // 创建目录
        if (descDir.mkdirs()) {
            System.out.println("目录 " + descDirNames + " 创建成功!");
            return true;
        } else {
            System.out.println("目录 " + descDirNames + " 创建失败!");
            return false;
        }
    }

}

文件目录:

压缩包为"123.zip":

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1230445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3父组件提交校验多个子组件

实现功能&#xff1a;在父组件提交事件中校验多个子组件中的form 父组件&#xff1a; <script setup lang"ts">import {ref, reactive} from vueimport childForm from ./childForm.vueimport childForm2 from ./childForm2.vuelet approvalRef ref()let ap…

分形简单版

我的代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N1000; int n; char s[N][N]; void work(int x) {if(x1) {s[0][0]*;return;}work(x-1);for(int i0;i<(1<<x-2);i)for(int j(1<<x-2);j<(1<<x-1);j) s[i][j]s[i][j-(…

火电安全事故vr模拟仿真培训强交互更真实

VR消防&#xff0c;利用VR虚拟现实技术&#xff0c;将VR和消防教育融合在一起达到寓教于乐的效果&#xff0c; VR消防教育是对于家中、校园内、大型商场、公司办公室等情景产品研发的消防安全培训类VR系统软件&#xff0c;根据互动体验、互动、视角实际操作、视听觉系统多度自然…

CV计算机视觉每日开源代码Paper with code速览-2023.11.16

点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构】ConvNet vs Transformer, Supervised vs CLIP: Beyond ImageNet Accuracy 论文地址&#xff1a;https://arxiv.org//pdf/23…

2023年亚太杯数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其…

【报错记录】解决使用Kotlin写的SpringBoot项目使用Aspect切面无法生效的问题

前言 为了能在SpringBoot使用Kotlin&#xff0c;真的是各种坑都彩礼一遍&#xff0c;这次遇到的问题是Aspect无法对Kotlin代码生效。我这里的使用场景是使用切面切Controller中的方法&#xff0c;用来对接口进行一些初始化和收尾工作。 Aspect在Controller类还是Java代码的时…

Databend 开源周报第 120 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 使用自定义 CON…

惠普打印机秋季新品震撼登场,以卓越品质赢得用户信赖,打造无限创新打印体验

北京&#xff0c;2023年11月20日 —— 今日&#xff0c; 2023惠普打印机秋季新品发布暨合作伙伴大会于北京举办。本次发布会以“品质 信赖&#xff0c;创新无界”为主题&#xff0c;惠普公司面向中国市场推出了四大系列、四十三款全新的打印产品&#xff0c;进一步丰富了其在细…

系统设计之通讯协议

一、通讯协议 架构风格定义了应用程序编程接口 (API) 的不同组件如何相互交互。因此&#xff0c;它们通过提供设计和构建 API 的标准方法来确保效率、可靠性以及与其他系统集成的便捷性。以下是最常用的样式&#xff1a; 1. SOAP 成熟、全面、基于XML 最适合于企业应用 可扩展…

开启AI高效办公时代,成为AI时代的先行者

文章目录 AI智能化办公&#xff1a;未来办公的新模式一、AI智能化办公的优势1. 提高工作效率2. 降低成本3. 提高决策质量4. 促进团队协作 二、AI智能化办公的应用场景1. 智能助手2. 智能会议3. 智能文档处理4. 智能数据分析 三、AI智能化办公的挑战与前景1. 数据安全与隐私保护…

LVGL 像文字一样,显示任意自定义符号

颜色可以在程序中设定,符号的C数组生成 这种应用非常适合类似汽车仪表盘中,有很多行业内特定符号需要显示的场景,而且符号需要根据情况改变颜色。网上这方面基本没有资料,本文是作者根据LVGL自定义字库的源代码修改来实现的。 使用工具: 设置:(根据液晶屏不同可能不同…

C++:哈希表的模拟实现

文章目录 哈希哈希冲突哈希函数 解决哈希冲突闭散列&#xff1a;开散列 哈希 在顺序结构和平衡树中&#xff0c;元素的Key和存储位置之间没有必然的联系&#xff0c;在进行查找的时候&#xff0c;要不断的进行比较&#xff0c;时间复杂度是O(N)或O(logN) 而有没有这样一种方案…

探索零信任架构的基础知识

根据普华永道 2023 年的一份报告&#xff0c;36% 的 CISO 已开始实施零信任组件。另外 25% 的人表示他们计划在未来几年内开始零信任之旅。 显然&#xff0c;“零信任”不仅仅是一个流行词&#xff1b;而是一个流行语。相反&#xff0c;它代表了世界对待网络安全方式的彻底转变…

Java-final

【1】修饰变量&#xff1b; 1.public class Test { 2. //这是一个main方法&#xff0c;是程序的入口&#xff1a; 3. public static void main(String[] args) { 4. //第1种情况&#xff1a; 5. //final修饰一个变量&#xff0c;变量的值不可以改变&#…

Yolov8部署——vs2019遇到的问题

Yolov8部署——vs2019遇到的问题 问题一&#xff1a; 默认库"LIBCMT"与其他库的使用冲突 解决方法&#xff1a;选择自己的项目右键属性——c/c——代码生成——运行库&#xff08;多线程&#xff08;/MT&#xff09; 问题二&#xff1a; 文件包含在偏移0x18处开始…

水库大坝安全监测系统守护水利工程安全的坚实后盾

WX-WY1 随着社会经济的发展和科技的进步&#xff0c;水利工程的安全问题越来越受到人们的关注。水库大坝作为水利工程的重要组成部分&#xff0c;其安全状况直接关系到周边地区人民的生命财产安全和生态环境。因此&#xff0c;建立一个高效、可靠的水库大坝安全监测系统至关重要…

苹果手机内嵌h5如何禁止全局弹性效果

简单模拟一个场景&#xff0c;这是一个商城的商品分类页面&#xff0c;是一个左右布局&#xff0c;左面是所有的分类&#xff0c;右面是展示这个分类的商品&#xff0c;这里为了简单就只写一个demo了。 <!DOCTYPE html> <html lang"en"><head><…

求臻医学受邀参加第三届基因检测行业发展高峰论坛并斩获三项荣誉

2023年11月18日&#xff0c;备受瞩目的第三届基因检测行业发展高峰论坛暨年度评选活动颁奖典礼在广州圆满召开。作为基因检测领域的佼佼者&#xff0c;求臻医学应邀参加了此次高峰论坛并斩获了基因检测行业年度风云企业奖、基因检测行业最具投资价值奖、基因检测行业最佳产品奖…

使用npm发布自己的组件库

在日常开发中&#xff0c;我们习惯性的会封装一些个性化的组件以适配各种业务场景&#xff0c;突发奇想能不能建一个自己的组件库&#xff0c;今后在各种业务里可以自由下载安装自己的组件。 一. 项目搭建 首先直接使用vue-cli创建一个vue2版本的项目&#xff0c;并下载好ele…