Java将一个文件下多个文件压缩并下载,文件夹目录如下:

每个文件下都有文件,要求实现将文件夹"A2023001_检查"压缩成"A2023001.zip",如下截图:

工具类ZipUtils:

public class ZipUtils {/*** 压缩一个文件或者目录** @param zipFileName 压缩后的文件名(绝对路径):*                    如E:\app_data\upload\temp\batchDownload\A2023001_检查.zip* @param zipFilePath 需要被压缩的文件路径(绝对路径):*                    如E:\app_data\upload\temp\batchDownload\A2023001_检查* @throws Exception*/public static void zip(String zipFileName, String zipFilePath) throws Exception {zip(zipFileName, new File(zipFilePath));}/*** @param zipFileName 压缩后的文件名及路径* @param zipFilePath   要被压缩的文件的输入流* @throws Exception*/public static void zip(String zipFileName, File zipFilePath) throws Exception {ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));zip(out, zipFilePath, "");System.out.println("zip done");out.close();}/*** 用于压缩整个目录或者单个文件** @param out  源文件的输出流* @param f    目标压缩文件的输入流* @param base a* @throws Exception*/private static void zip(ZipOutputStream out, File f, String base) throws Exception {System.out.println("Zipping  " + f.getName());if (f.isDirectory()) {File[] fl = f.listFiles();//out.putNextEntry(new ZipEntry(base+"/"));out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + f.getName() + "/"));for (int i = 0; i < fl.length; i++) {//zip(out,fl[i],base);zip(out, fl[i], base + f.getName() + "/");}} else {//base=base.length()==0?"":base+"/";out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + f.getName()));FileInputStream in = new FileInputStream(f);int len;byte[] buffer = new byte[1024];while ((len = in.read(buffer)) != -1) {out.write(buffer, 0, len);}in.close();}}/*** 解压缩** @param zipFileName     压缩文件* @param outputDirectory 目标路径* @throws Exception*/public static void unzip(String zipFileName, String outputDirectory) throws Exception {ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));ZipEntry z;while ((z = in.getNextEntry()) != null) {System.out.println("unziping " + z.getName());if (z.isDirectory()) {String name = z.getName();name = name.substring(0, name.length() - 1);File f = new File(outputDirectory + File.separator + name);f.mkdir();System.out.println("mkdir " + outputDirectory + File.separator + name);} else {File f = new File(outputDirectory + File.separator + z.getName());f.createNewFile();FileOutputStream out = new FileOutputStream(f);int b;while ((b = in.read()) != -1){out.write(b);}out.close();}}in.close();}//测试压缩文件public static void main(String[] args) throws Exception {String zipFileName="E:\\app_data\\upload\\temp\\batchDownload\\A2023001_检查.zip";String zipFilePath="E:\\app_data\\upload\\temp\\batchDownload\\A2023001_检查";zip(zipFileName,zipFilePath);}
}

实际工作中运用调用如下:

/*** 附件批量下载:打zip包** @param request* @param response*/@RequestMapping(value = "/batchDownLoad.do")public void batchDownLoad(HttpServletRequest request, HttpServletResponse response) {FileInputStream fis = null;OutputStream os = null;try {//设置页面静态文字中文编码response.setCharacterEncoding("UTF-8");//压缩目录:为了本地测试写了本地地址,实际工作中写服务器地址String dateDir = "E:\\app_data\\upload\\temp\\batchDownload\\";//压缩名:实际工作中写定义的压缩名如系统当前时间+6位随机数(zipDirName = DateUtils.getCurrYYYYMMDD() + "_" + RandomUtils.randomByNumber(6))String zipDirName = "A2023001_检查";//定义临时压缩文件名String zipName = zipDirName + ".zip";//下面建打zip包用的子目录:E:\\app_data\\upload\\temp\\batchDownload\\A2023001_检查\\String targetFilePath = dateDir + zipDirName + File.separator;//判断是否存在该临时目录,没有就建立File targetPath = new File(targetFilePath);if (!targetPath.exists()) {targetPath.mkdirs();}//压缩后的文件名路径:E:\\app_data\\upload\\temp\\batchDownload\\A2023001_检查.zipString downLoadFile = dateDir + zipDirName + ".zip";//压缩文件(调用工具类)ZipUtils.zip(downLoadFile, targetFilePath);//创建zip文件File file = new File(downLoadFile);fis = new FileInputStream(file);os = response.getOutputStream();zipName = new String(zipName.getBytes("UTF-8"), "ISO8859-1");//文件名解决中文乱码:该方法从浏览器下载中文名正常展示//重置,清除缓存response.reset();//附件下载且UTF-8编码response.setContentType("application/x-download;charset=UTF-8");//附件下载中文乱码问题:该方法从浏览器下载中文名正常展示response.addHeader("Content-Disposition", "attachment;filename=" + zipName);//附件下载文件长度response.addHeader("Content-Length", "" + (int) file.length());int len;byte[] buffer = new byte[8192];while ((len = fis.read(buffer)) > 0) {os.write(buffer, 0, len);os.flush();}} catch (Exception e) {e.getMessage();logger.error("附件下载失败!", e);} finally {try {if (os != null) {os.close();}if (fis != null) {fis.close();}} catch (IOException e) {e.getMessage();logger.error("附件批量下载:打zip包IOException:{}", e);}}}

以上代码,实际工作中能够正常运用,调用压缩工具类主要是压缩后的文件名绝对地址,需要被压缩的文件绝对路径,最后创建压缩文件,输出流读取输出

Java将一个文件夹下多个文件压缩并下载(工作案例)相关推荐

  1. java 读文件夹_java怎么读取读取文件夹下的所有文件夹和文件?

    下是实现的代码:package com.borland.samples.welcome; import java.io.FileNotFoundException; import java.io.IO ...

  2. java 文件 递归_JAVA实现遍历文件夹下的所有文件(递归调用和非递归调用)

    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...

  3. java怎么读取文件夹下的_java怎么读取读取文件夹下的所有文件夹和文件?

    下是实现的代码:package com.borland.samples.welcome; import java.io.FileNotFoundException; import java.io.IO ...

  4. Java中如何读取文件夹下的所有文件

    问题:Java中如何读取文件夹下的所有文件 Java里面是如何读取一个文件夹下的所有文件的? 回答一 public void listFilesForFolder(final File folder) ...

  5. Java io流---拷贝文件夹下的所有文件和目录

    Java io流-拷贝文件夹下的所有文件和目录 代码: package demo01;import java.io.*; import java.util.TreeMap;public class C ...

  6. java怎样输出一个文件夹,java合并一个文件夹下所有txt文件,输出到另一个txt,...

    java合并一个文件夹下所有txt文件,输出到另一个txt,最近写了个单元测试,递归调用方法,把同一个文件夹里所有的txt合并输出到一个txt文件.参考了两个博客,分别是已有的方法,还有个就是检测tx ...

  7. java读取某个文件夹下的所有文件

    import java.io.FileNotFoundException; import java.io.IOException; import java.io.File; public class  ...

  8. java 文件夹下的文件_java读取某个文件夹下的所有文件

    import java.io.FileNotFoundException; import java.io.IOException; import java.io.File; public class  ...

  9. java中如何删除文件或清除文件夹下的所有文件

    java中如何删除文件或清除文件夹下的所有文件呢?现实中如果一个java项目中涉及非常多的删除文件操作,我们最好单独写一个函数实现文件的删除操作,以下是函数的实现: // 删除文件 或者 清除文件夹下 ...

  10. java判断文件夹下是否存在文件_java 判断文件夹是否存在文件

    java 判断文件夹是否存在文件 1.首先使用File类创建一个File对象: 2.然后判断是否是目录,不是目录就返回 3.之后使用file.list()方法获取目录下文件并存入数组 4.最后判断数组 ...

最新文章

  1. Django model层 mysql_Django模型层(models.py)之模型创建
  2. 2018-2019-1 20165201 《信息安全系统设计基础》第6周学习总结
  3. luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)
  4. 简历上的“熟练掌握 RPC”,到底是个什么水平?
  5. Java 8 Friday Goodies:轻松派本地缓存
  6. bch怎么挖_BCH与BSV的减半,给目前正在反弹中的行情带来什么?
  7. SAP License:ERP财务软件简介
  8. linux运维云计算课程学习,Linux云计算面试时遇到的问题
  9. Linux下VsFTP和ProFTP用户管理高级技巧 之一
  10. Struts2 标签
  11. JAVA上传文件 DiskFileUpload组件
  12. hackintosh黑苹果_如何构建用于编码的Hackintosh
  13. 【蓝桥杯真题】走迷宫算法
  14. PS(Photoshop)去水印的方法
  15. 格力机器人图解_你所不知道的格力机器人战略
  16. excel随机数_办公软件操作技巧052:如何在excel中填充随机数
  17. 【地理中国】百年地理大发现(全8集)内容笔记记录
  18. 【赛百味加入区块链试验项目以提高食品供应链透明度】GBCAX
  19. 互联网日报 | 6月24日 星期四 | 快手全球月活已达10亿;HarmonyOS 2首批正式版升级;微软市值突破2万亿美元...
  20. Windows无限弹窗程序

热门文章

  1. Pandas学习(三)——NBA球员薪资分析
  2. 计算机类学生要考计算机二级证?看看对你有帮助
  3. 黑马程序员 Java自学总结十六 网络编程
  4. 简约的博客网页制作 大学生个人博客网页设计模板 学生个人网页成品 DIV简单个人网站作品下载 静态HTML CSS个人网页作业源代码
  5. std::mutex::lock
  6. 魅蓝这也叫向5c致敬?
  7. 设计文件加密服务器,如何设计数据库文件加密系统
  8. 我的个人网站——“甜果网”上线了!
  9. 2021年12月中国A股通信设备行业上市企业市值排行榜:佳讯飞鸿总市值增幅最大,移远通信股价达到203.9元/股(附月榜TOP79详单)
  10. windows、mac、Linux 各系统字节换算单位