Java 解压文件

本文介绍了如何在Java项目中使用Maven依赖,如Hutool和ApacheCommonsIO,来处理文件操作,包括生成MultipartFile、解压zip文件以及处理PDF文件。作者通过MockMultipartFile模拟了实际文件操作的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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":

运行结果:

参考:Java MultipartFile和MockMultipartFile,创建MultipartFile文件-优快云博客

Classes contained in spring-mock.jar: org.springframework.mock.jndi.ExpectedLookupTemplate.class org.springframework.mock.jndi.SimpleNamingContext.class org.springframework.mock.jndi.SimpleNamingContextBuilder.class org.springframework.mock.web.DelegatingServletInputStream.class org.springframework.mock.web.DelegatingServletOutputStream.class org.springframework.mock.web.HeaderValueHolder.class org.springframework.mock.web.MockExpressionEvaluator.class org.springframework.mock.web.MockFilterChain.class org.springframework.mock.web.MockFilterConfig.class org.springframework.mock.web.MockHttpServletRequest.class org.springframework.mock.web.MockHttpServletResponse.class org.springframework.mock.web.MockHttpSession.class org.springframework.mock.web.MockMultipartFile.class org.springframework.mock.web.MockMultipartHttpServletRequest.class org.springframework.mock.web.MockPageContext.class org.springframework.mock.web.MockRequestDispatcher.class org.springframework.mock.web.MockServletConfig.class org.springframework.mock.web.MockServletContext.class org.springframework.mock.web.PassThroughFilterChain.class org.springframework.mock.web.portlet.MockActionRequest.class org.springframework.mock.web.portlet.MockActionResponse.class org.springframework.mock.web.portlet.MockMultipartActionRequest.class org.springframework.mock.web.portlet.MockPortalContext.class org.springframework.mock.web.portlet.MockPortletConfig.class org.springframework.mock.web.portlet.MockPortletContext.class org.springframework.mock.web.portlet.MockPortletPreferences.class org.springframework.mock.web.portlet.MockPortletRequest.class org.springframework.mock.web.portlet.MockPortletRequestDispatcher.class org.springframework.mock.web.portlet.MockPortletResponse.class org.springframework.mock.web.portlet.MockPortletSession.class org.springframework.mock.web.portlet.MockPortletURL.class org.springframework.mock.web.portlet.MockRenderRequest.class org.springframework.mock.web.portlet.MockRenderResponse.class org.springframework.test.AbstractDependencyInjectionSpringContextTests.class org.springframework.test.AbstractSingleSpringContextTests.class org.springframework.test.AbstractSpringContextTests.class org.springframework.test.AbstractTransactionalDataSourceSpringContextTests.class org.springframework.test.AbstractTransactionalSpringContextTests.class org.springframework.test.AssertThrows.class org.springframework.test.ConditionalTestCase.class org.springframework.test.annotation.AbstractAnnotationAwareTransactionalTests.class org.springframework.test.annotation.DirtiesContext.class org.springframework.test.annotation.ExpectedException.class org.springframework.test.annotation.IfProfileValue.class org.springframework.test.annotation.NotTransactional.class org.springframework.test.annotation.ProfileValueSource.class org.springframework.test.annotation.Repeat.class org.springframework.test.annotation.SystemProfileValueSource.class org.springframework.test.annotation.Timed.class org.springframework.test.jpa.AbstractAspectjJpaTests.class org.springframework.test.jpa.AbstractJpaTests.class org.springframework.test.jpa.OrmXmlOverridingShadowingClassLoader.class org.springframework.test.web.AbstractModelAndViewTests.class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值