Java 批量文件压缩导出并下载到本地示例代码

要实现 Java 批量文件压缩导出并下载到本地,需要完成以下步骤:

  1. 构建压缩文件流
  2. 将文件流写入输出流
  3. 设置 HTTP 响应头信息
  4. 导出压缩文件

可以使用 java.util.zip 包中的 ZipOutputStream 对文件进行压缩。

以下是一个示例代码,实现将多个文件打成一个压缩包,压缩包文件名为 example.zip ,然后将压缩包导出并下载到本地。

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class FileCompress {

    public static void main(String[] args) throws Exception {
        // 待压缩的文件数组
        File[] files = new File[]{new File("file1.txt"), new File("file2.txt"), new File("file3.txt")};

        // 压缩后的文件名
        String zipFileName = "example.zip";

        // 输出流
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFileName));

        // 遍历待压缩的文件数组,分别进行压缩
        for (File file : files) {
            FileInputStream fis = new FileInputStream(file);
            ZipEntry entry = new ZipEntry(file.getName());
            zos.putNextEntry(entry);

            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) > 0) {
                zos.write(buffer, 0, len);
            }
            fis.close();
            zos.closeEntry();
        }
        zos.close();

        // 设置 HTTP 响应头信息
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=" + zipFileName);

        // 导出压缩文件
        InputStream in = new FileInputStream(zipFileName);
        OutputStream out = response.getOutputStream();
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
        File zipFile = new File(zipFileName);
        if(zipFile.exists()) {
            zipFile.delete();
        }
    }
}

以上代码中 File[] files 数组中的元素表示待压缩的文件,String zipFileName 是压缩后的文件名。在遍历待压缩的文件数组时,先创建 FileInputStream 对象读入文件,然后创建 ZipEntry 对象表示待压缩的文件,使用 ZipOutputStreamputNextEntry 方法将其添加到压缩包中,然后使用 FileOutputStream 对象创建压缩后的文件,并将其写入输出流中。请求结束后,通过设置 HTTP 响应头信息和导出压缩文件的方式实现下载到本地。

以下是另一个示例代码,实现将一个目录下的所有子目录和文件打成一个压缩包,并将压缩包导出并下载到本地。

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class DirectoryCompress {
    public static void main(String[] args) throws Exception {
        // 待压缩目录
        String srcDirPath = "/example/dir";

        // 压缩后的文件名
        String zipFileName = "example.zip";

        // 输出流
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFileName));

        // 创建文件对象
        File srcDir = new File(srcDirPath);

        // 调用递归压缩方法进行压缩
        compress(srcDir, zos, "");

        zos.close();

        // 设置 HTTP 响应头信息
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=" + zipFileName);

        // 导出压缩文件
        InputStream in = new FileInputStream(zipFileName);
        OutputStream out = response.getOutputStream();
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
        File zipFile = new File(zipFileName);
        if(zipFile.exists()) {
            zipFile.delete();
        }
    }

    /**
     * 递归压缩方法
     */
    private static void compress(File sourceFile, ZipOutputStream zos, String name) throws Exception {
        byte[] buf = new byte[1024];
        if (sourceFile.isFile()) {
            //在 Zip 压缩包中添加文件条目
            zos.putNextEntry(new ZipEntry(name + sourceFile.getName()));
            // 读取待压缩的文件并将其添加到 Zip 压缩包中
            int len;
            FileInputStream in = new FileInputStream(sourceFile);
            while ((len = in.read(buf)) > 0) {
                zos.write(buf, 0, len);
            }
            // 关闭文件流
            in.close();
        } else {
            // 如果是目录,则递归调用
            File[] files = sourceFile.listFiles();
            if (files == null || files.length == 0) {
                zos.putNextEntry(new ZipEntry(name + "/"));
            } else {
                for (File file : files) {
                    compress(file, zos, name + sourceFile.getName() + "/");
                }
            }
        }
    }
}

以上代码首先定义了待压缩目录的路径 srcDirPath 和压缩后的文件名 zipFileName,然后通过递归方法 compress 实现对整个目录进行递归压缩。在 compress 方法中,判断若是文件,则读取该文件并将其写入到 ZipOutputStream 的输出流中;若是目录,则递归调用方法。最后导出压缩文件的方式和前面示例代码类似。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 批量文件压缩导出并下载到本地示例代码 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java servlet 几种页面跳转的方法

    Java Servlet 几种页面跳转的方法 在 Java 的 Servlet 编程中,页面跳转是一项至关重要的技能。实现页面的跳转可以使Web服务器更加灵活地管理页面的内容和功能。这里我们介绍几种常见的跳转方式。 重定向(Redirect) 重定向是范围最广,也是最常见的页面跳转方式。它的好处是可以跳转到其他 Web 站点中的任意一个页面,但是缺点是 UR…

    Java 2023年6月15日
    00
  • java中线程挂起的几种方式详解

    Java中线程挂起的几种方式详解 在Java中,我们可以通过挂起线程来实现线程的暂停,以便于进行一些特殊的处理。下面将介绍Java中线程挂起的几种方式。 1. 使用Thread.sleep() 调用Thread.sleep()方法可以让当前线程休眠指定的时间(以毫秒为单位)。例如,以下代码将让当前线程休眠5秒钟: try { Thread.sleep(500…

    Java 2023年5月19日
    00
  • Java中Lambda表达式和函数式接口的使用和特性

    Java中Lambda表达式和函数式接口的使用和特性 什么是Lambda表达式 Lambda表达式是Java 8中引入的新特性,简化了在Java中使用函数式编程的写法。Lambda表达式本质是一个匿名函数,可以被看作是一个代码块,使得代码更加简洁清晰。 Lambda表达式使用类似于箭头的符号(->)将参数列表和函数体分开,其语法格式为: (parame…

    Java 2023年5月26日
    00
  • Spring AOP官方文档学习笔记(二)之基于注解的Spring AOP

    1.@Aspect注解 (1) @Aspect注解用于声明一个切面类,我们可在该类中来自定义切面,早在Spring之前,AspectJ框架中就已经存在了这么一个注解,而Spring为了提供统一的注解风格,因此采用了和AspectJ框架相同的注解方式,这便是@Aspect注解的由来,换句话说,在Spring想做AOP框架之前,AspectJ AOP框架就已经很…

    Java 2023年4月17日
    00
  • java用两个例子充分阐述多态的可拓展性介绍

    给您介绍一下如何使用Java的多态来实现可拓展性。 什么是多态 在Java中,多态是指一个对象的实际类型可能是其父类、接口或抽象类,这种特性可以让相同类型的对象执行相同的方法,但可能会有不同的实现方式。因此,多态可以让代码更加灵活,也更容易维护。 多态的可拓展性介绍 多态在Java中实现可拓展性的方法是,当新增一个子类时,只需要重写跟父类相同的方法即可,然后…

    Java 2023年5月20日
    00
  • Spring SpringMVC,Spring整合MyBatis 事务配置的详细流程

    下面是关于Spring、SpringMVC和MyBatis整合以及事务配置的详细流程,包含两个示例说明。 Spring、SpringMVC和MyBatis整合以及事务配置 Spring、SpringMVC和MyBatis是Java Web应用程序开发中常用的框架。在本文中,我们将介绍如何将这三个框架整合在一起,并配置事务管理。 步骤1:添加依赖 首先,我们需…

    Java 2023年5月17日
    00
  • SpringMVC处理Form表单实例

    下面是关于SpringMVC处理Form表单的完整攻略,包含两个示例说明。 SpringMVC处理Form表单实例 SpringMVC是一个基于MVC架构的Web框架,它提供了一种方便的方式来处理Web应用程序中的表单数据。在本文中,我们将介绍如何使用SpringMVC处理Form表单数据。 步骤1:创建表单 首先,我们需要创建一个HTML表单,以便用户可以…

    Java 2023年5月17日
    00
  • 基于SpringMVC入门案例及讲解

    以下是关于“基于SpringMVC入门案例及讲解”的完整攻略,其中包含两个示例。 1. 前言 SpringMVC是一种常用的Java Web开发框架,其核心思想是基于MVC模式来实现Web应用程序开发。本攻略将详细讲解基于SpringMVC入门案例及讲解,包括SpringMVC的基本概念、配置方法以及一个示例。 2. SpringMVC的基本概念 以下是Sp…

    Java 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部