Java导出压缩文件

2023-11-07

 

 在很多场景需要导出很多的文件,将其压缩成zip是一个很不错的选择。

先将要压缩的文件路径和名称得到,然后用工具类将其压缩。代码逻辑清晰,使用得修改一些文件路径。
实现类中导出方法中:

String zipFileName = "工单附件" + "-" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".zip";
                        String fileZip = System.getProperty("user.dir") + "/zipTemp/" + zipFileName;
                        File pocZipFile = new File(fileZip);
                        CompressUtil.compress(filePathList, fileZip, false,workOrder.getWorkOrderNo());
                        CompressUtil.downloadZip(response, zipFileName, pocZipFile);
                        boolean b = FileUtils.deleteFileOrDirectory(System.getProperty("user.dir") + "/zipTemp");
                        log.info(b?"删除成功":"删除失败");

 导出的工具类,具体按实际场景改变,仅供参考;


public class CompressUtil {

    /**
     * 生成zip压缩文件
     * @param filePaths
     * @param zipFilePath
     * @param keepDirStructure
     */
    public static void compress(List<Map<String, String>> filePaths, String zipFilePath, Boolean keepDirStructure,String workNo) {
        byte[] buf = new byte[1024 * 8];
        File zipFile = new File(zipFilePath);
        FileUtils.createParentPath(zipFile);
        try {
            if(!zipFile.exists()){
                zipFile.createNewFile();
            }
            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));
            for (int i = 0; i < filePaths.size(); i++) {
                String relativePath = filePaths.get(i).get("filePath");
                String relativeName = filePaths.get(i).get("fileName");
                if (StringUtils.isEmpty(relativePath)) {
                    continue;
                }
                File sourceFile = new File(relativePath);
                if (sourceFile == null || !sourceFile.exists()) {
                    continue;
                }
                FileInputStream fis = new FileInputStream(sourceFile);
                BufferedInputStream bis = new BufferedInputStream(fis);
                String fileName = "工单附件" + "-" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
                if (keepDirStructure != null && keepDirStructure) {
                    zos.putNextEntry(new ZipEntry(fileName+"/"+workNo +"/"+ relativePath));
                    //zos.putNextEntry(new ZipEntry(relativePath));
                } else {
                    zos.putNextEntry(new ZipEntry(fileName+"/"+workNo + "/" + relativeName));
                }
                int len;
                while ((len = bis.read(buf)) > 0) {
                    zos.write(buf, 0, len);
                }
                zos.closeEntry();
                fis.close();
                bis.close();
                // zos.close();
            }
            zos.close();

            if (!zipFile.exists()) {
                zipFile.createNewFile();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    public static void wordCompress(List<Map<String, String>> filePaths, String zipFilePath, Boolean keepDirStructure) {
        byte[] buf = new byte[1024 * 8];
        File zipFile = new File(zipFilePath);
        FileUtils.createParentPath(zipFile);
        try {
            if(!zipFile.exists()){
                zipFile.createNewFile();
            }
            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));
            for (int i = 0; i < filePaths.size(); i++) {
                String relativePath = filePaths.get(i).get("filePath");
                String relativeName = filePaths.get(i).get("fileName");
                if (StringUtils.isEmpty(relativePath)) {
                    continue;
                }
                File sourceFile = new File(relativePath);
                if (sourceFile == null || !sourceFile.exists()) {
                    continue;
                }
                FileInputStream fis = new FileInputStream(sourceFile);
                BufferedInputStream bis = new BufferedInputStream(fis);
                String fileName = "工单文档" + "-" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
                if (keepDirStructure != null && keepDirStructure) {
                    zos.putNextEntry(new ZipEntry(fileName+"/"+ relativePath));
                    //zos.putNextEntry(new ZipEntry(relativePath));
                } else {
                    zos.putNextEntry(new ZipEntry(fileName+"/" + relativeName));
                }
                int len;
                while ((len = bis.read(buf)) > 0) {
                    zos.write(buf, 0, len);
                }
                zos.closeEntry();
                fis.close();
                bis.close();
                // zos.close();
            }
            zos.close();

            if (!zipFile.exists()) {
                zipFile.createNewFile();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }





    /**
     * 下载zip
     *
     * @param response
     * @param zipName  浏览器header中zip名称
     * @param zipFile  zipFile文件
     */
    public static void downloadZip(HttpServletResponse response, String zipName, File zipFile) {
        //下载文件
        try {
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/zip");
//            response.setContentType("application/zip");
            response.setHeader("Content-Disposition", "attachment;FileName=" + URLEncoder.encode(zipName, "UTF-8"));
            response.addHeader("Content-Length", "" + zipFile.length());
            ServletOutputStream out = response.getOutputStream();
            int len = 0;
            FileInputStream fis = new FileInputStream(zipFile);
            BufferedInputStream bis = new BufferedInputStream(fis);
            int count = fis.available();
            byte[] buffer = new byte[count];
            while ((len = bis.read(buffer)) > 0) {
                out.write(buffer, 0, len);
                out.flush();
            }
            out.close();
            fis.close();
            bis.close();
            response.flushBuffer();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 上面工具类中创建父文档的方法;


 public static void createParentPath(File file) {
        File parentFile = file.getParentFile();
        if (null != parentFile && !parentFile.exists()) {
            parentFile.mkdirs(); // 创建文件夹
            createParentPath(parentFile); // 递归创建父级目录
        }
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java导出压缩文件 的相关文章

  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • 有没有创建 Cron 表达式的 Java 代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个 Java 代码来根据用户输入创建一个 cron 表达式 用户输入是时间 频率和执行次数 只需从评论中添加 自己创建 即可
  • Java 的支持向量机?

    我想用Java编写一个 智能监视器 它可以随时发出警报detects即将到来的性能问题 我的 Java 应用程序正在以结构化格式将数据写入日志文件
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • 断言 Kafka 发送有效

    我正在使用 Spring Boot 编写一个应用程序 因此要写信给 Kafka 我这样做 Autowired private KafkaTemplate
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • Java Applet 中的 Apache FOP - 未找到数据的 ImagePreloader

    我正在研究成熟商业产品中的一个问题 简而言之 我们使用 Apache POI 库的一部分来读取 Word DOC 或 DOCX 文件 并将其转换为 XSL FO 以便我们可以进行标记替换 然后 我们使用嵌入到 Java 程序中的 FOP 将
  • 如何使用 JMagick 转换色彩空间?

    如何使用 JMagick API 转换色彩空间 例如 CMYK gt RGB 和 RGB gt CMYK None
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v

随机推荐

  • Hive启动报错(个人遇到问题&解决方法)

    hive执行sql报错 FAILED SemanticException org apache hadoop hive ql metadata HiveException java lang RuntimeException Unable
  • C++ 代码换行

    1 字符串太长 换行显示 怎么办 2 使用反斜杠 如下 string str abcd 1234 注意 反斜杠后面不准有任何字符 下一行开头的制表符不包含在整个字符串中 但是下一行开头的空格符包含在整个字符串中 3 使用双引号 如下 str
  • 浅谈关于QT中Webkit内核浏览器

    关于QT中Webkit内核浏览器是本文要介绍的内容 主要是来学习QT中webkit中浏览器的使用 提起WebKit 大家自然而然地想到浏览器 作为浏览器内部的主要构件 WebKit的主要工作是渲染 给定一个HTML文件 WebKit的工作是
  • linux设备管理之设备号与次设备号

    linux设备管理之主设备号与次设备号 jinzi 博客园 剽窃 过来的 记录下 以备查 主设备号和次设备号 一个字符设备或者块设备都有一个主设备号和次设备号 主设备号和次设备号统称为设备号 主设备号用来表示一个特定的驱动程序 次设备号用来
  • 使用 Python 对股票数据分析预测

    使用 Python 对股票数据分析预测 文章目录 使用 Python 对股票数据分析预测 目录索引 模块安装 股票数据获取 雅虎财经 Quandl 模块 Pandas Datareader 模块 数据预处理 缺失值查找 数据规范化 股价涨跌
  • 前端埋点VS后端埋点

    前端埋点比后端埋点更灵活 比如页面停留时间 点击下拉框动作等都可以通过埋点接口让后端记录下来 而后端埋点 这些是记录不下来的 因为没有请求 后端埋点还有一个问题 有可能前端不同按钮调用后端同一个接口 此时后端埋点是区分不出来的 后端埋点又分
  • 代码习惯

    补个liangs333的代码习惯 include
  • 全面 Serverless 化,阿里云微服务引擎 MSE 重磅升级

    微服务已成为企业数字化首选的应用架构 并正在向缩短服务的构建周期和降低资源成本 提升架构质量和架构效率两个方向演进 今天 阿里云正式宣布微服务引擎 MSE 重磅升级 全面 Serverless 化 带来两大新形态和两大新体验 产业新形态 业
  • [Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口

    AIDL文件在Android系统上应用广泛 和底层的Binder机制紧密关联 在Android源码或者Android Studio中通常是自动编译aidl文件 生成对应语言的接口文件 做应用层Java开发 aidl和binder封装的比较
  • centos7虚拟网卡其他服务器不识别,Vmware10 下安装centos7,网卡无法识别问题处理...

    问题表现 之前安装的是32位版本的centos5 后来操作不当损坏 于是安装了64位版本的centos7 安装后网卡无法识别 用如下第一种方式顺利解决 网络连接使用nat方式 由于Vmware虚拟网卡和linux兼容问题导致驱动无法正常安装
  • Retrofit+OKHttp+RxAndroid,图文最详细解释(Kotlin)

    文章目录 一 Retrofit 1 上图说明了如下几点 2 Retrofit 对Okhttp做了什么 3 下面我们来看一下Retrofit的具体使用 1 导入依赖 module build gradle下 2 添加网络权限 src main
  • mac iterm2快捷键

    mac iterm2快捷键 1 命令一 查找 Cmd f 自动完成 Cmd 命令历史 Cmd Shift H
  • vue 组件同页面多次调用 props 传值无效

    项目场景 在同一个编辑页面使用了同一个Vue组件 导致props 传值无效 问题描述 在做一个文章编辑的页面 需要通过切换文章类型 音频 视频 显示隐藏上传不同类型的按钮给用户上传 例如以下代码会出现一个奇怪的问题 当我从article m
  • MySQL笔记 —— 基础(概念,对于数据库、表、数据的各种操作语句)

    目录 关系型数据库 创建 查看 删除数据库 创建表 查询表 删除表 修改表结构 插入数据 删除数据 修改数据 查询语句 where与having的区别 语句的执行顺序 别名 子句中的运算符 limit 分页 关系型数据库 数据库与普通文件系
  • SQL每日一练(牛客新题库)——第3天: 条件查询

    文章目录 1 查找某个年龄段的用户信息 2 查找除复旦大学的用户信息 3 用where过滤空值练习 4 高级操作符练习 1 5 如何让刷题变得更高效 1 查找某个年龄段的用户信息 题目 现在运营想要针对20岁及以上且23岁及以下的用户开展分
  • 金蝶部署在公有云服务调用外部链接报错:错误为:System.Net.WebException: 基础连接已经关闭: 发送时发生错误。

    刚开始一直以为是因为外部链接是https的问题 就一直更改安全协议 代码改为 if url StartsWith https StringComparison OrdinalIgnoreCase 创建HttpWebRequest reque
  • 常用的搜索引擎

    参考博客 https www chinaz com news 2017 0822 798159 shtml 1 Google 2 Bing 3 Yahoo 4 百度
  • 使用MyBatis分页插件PageHelper遇到的问题

    最近在使用mybatis的PageHelper进行分页查询时 遇到了不少问题 总结一下希望能帮到别人 1 版本错误 报错如下 java lang NoSuchMethodError java util List net sf jsqlpar
  • 关于调用Callable时的一个问题分享--总是只输出最后一次数据

    问题描述 我本来想使用线程池 ExecutorService Callable实现多线程处理数据 测试过程发现 只循环2到3次时 最终输出的数据只有最后一次遍历的数据 很奇怪 遇到问题解决问题 1 首先把我的测试代码贴出来 1 1 测试代码
  • Java导出压缩文件

    在很多场景需要导出很多的文件 将其压缩成zip是一个很不错的选择 先将要压缩的文件路径和名称得到 然后用工具类将其压缩 代码逻辑清晰 使用得修改一些文件路径 实现类中导出方法中 String zipFileName 工单附件 new Sim