Java中解压缩文件的方法

2025-12-26 15:09:19

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

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

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

图片描述

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

一、使用的技术

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

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

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

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

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

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

  4. 关闭 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&lt;? extends ZipEntry&gt; entries = zipFile.entries();
        while (entries.hasMoreElements()) {
            ZipEntry entry = entries.nextElement();

            // 解压缩条目到目标文件夹
            String entryName = entry.getName();
            entryName = new String(entryName.getBytes(Charset.forName(&quot;gbk&quot;)));
            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)) &gt; 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(&quot;/list&quot;)
public TableDataInfo list(MultipartFile multipartFile) throws IOException {
    //要下载到的本地临时文件路径
    File fileTemp = new File(&quot;D:\\unzipTest\\Test.zip&quot;);
    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&lt;StudentScores&gt; list = new ArrayList&lt;&gt;();
    return getDataTable(list);
}



/**
 * 文件解压缩
 * @return
 */
public static List&lt;String&gt; 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&lt;? extends ZipEntry&gt; entries = zipFile.entries();
        while (entries.hasMoreElements()) {
            ZipEntry entry = entries.nextElement();

            // 解压缩条目到目标文件夹
            String entryName = entry.getName();
            entryName = new String(entryName.getBytes(Charset.forName(&quot;gbk&quot;)));
            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)) &gt; 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;
}

}

声明:该内容由作者自行发布,观点内容仅供参考,不代表平台立场;如有侵权,请联系平台删除。
标签:
技术栈