Java压缩/读取/解压ZIP工具类 您所在的位置:网站首页 java代码怎么压缩zip文件 Java压缩/读取/解压ZIP工具类

Java压缩/读取/解压ZIP工具类

2023-04-21 11:33| 来源: 网络整理| 查看: 265

关注“腾飞开源”,一起共同成长!

1、内容介绍

使用Java对zip格式文件操作封装成工具类,实现对上传文件压缩成zip格式进行保存指定目录、读取目录下的文件压缩成zip格式进行下载、对zip压缩文件进行解压到指定目录​。

2、ZIP工具类源码

package com.tfos.study.util; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; ​ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; ​ import org.springframework.util.ObjectUtils; ​ import lombok.extern.slf4j.Slf4j; /** * 类功能说明:压缩/读取/解压ZIP工具类 * 公司名称:TF(腾飞)开源 * 作者:luorongxi */ @Slf4j public class ZipUtils { /** * 写入文件压缩为ZIP格式 * @param filePaths 被压缩文件路径 * @param zipPath 生成zip文件路径 */ public static void writeZip(List filePaths, String zipPath){ try{ File zipFile = new File(zipPath); // 判断文件是否存在,如文件不存在创建一个新文件 if (!zipFile.exists()){ zipFile.createNewFile(); } // 创建一个zip文件输出流 ZipOutputStream zipOutput = new ZipOutputStream(new FileOutputStream(zipFile)); for (String filePath : filePaths){ File file = new File(filePath); // 判断文件是否存在,如不存在直接跳过 if (!file.exists()){ continue; } /** * 创建一个缓冲读取流,提高读取效率 * 也可以直接创建一个 FileInputStream 对象,BufferedInputStream内部维护了一个8KB的缓冲区,BufferedInputStream本身不具备读取能力 * BufferedInputStream 可以手动指定缓冲区大小 单位为字节例如:new BufferedInputStream(new FileInputStream(file), 10240) */ BufferedInputStream bufferedInput = new BufferedInputStream(new FileInputStream(file)); // 设置压缩条目名称 zipOutput.putNextEntry(new ZipEntry(file.getName())); byte[] bytes = new byte[1024]; int len = -1; // 读取file内的字节流,写入到zipOutput内 while ((len = bufferedInput.read(bytes)) != -1){ zipOutput.write(bytes,0,len); } // 关闭输入流 // 无需关闭new FileInputStream(file)的输入流 因为BufferedInputStream.close()方法内部已经调用了FileInputStream.close()方法 bufferedInput.close(); // 写入完毕后关闭条目 zipOutput.closeEntry(); } zipOutput.close(); }catch (IOException e){ log.error("写入文件压缩为ZIP格式失败:"+e.getMessage()); } } /** * 读取文件压缩为ZIP格式 * @param request * @param response * @param filePaths 被压缩文件路径 */ public static void readZip(HttpServletRequest request, HttpServletResponse response, List filePaths) throws Exception { long start = System.currentTimeMillis(); // 设置文件名 formatFileName(request, response); ZipOutputStream zos = null; try { zos = new ZipOutputStream(response.getOutputStream()); for(String fileUrl : filePaths){ File file = new File(fileUrl); if (!ObjectUtils.isEmpty(file)) { byte[] buf = new byte[1024]; zos.putNextEntry(new ZipEntry(file.getName())); int len; FileInputStream inputStream = new FileInputStream(file); while ((len = inputStream.read(buf)) != -1){ zos.write(buf, 0, len); } inputStream.close(); zos.closeEntry(); } } long end = System.currentTimeMillis(); log.info("压缩完成,耗时:" + (end - start) +" ms"); } catch (Exception e) { throw new RuntimeException("压缩文件为ZIP格式失败:", e); }finally{ if(zos != null){ try { zos.close(); } catch (IOException e) { e.printStackTrace(); } } } } ​ /** * 设置响应信息和格式化附件名字 * @param request * @param response * @throws UnsupportedEncodingException */ private static void formatFileName(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException { String fileName = "Face.zip"; // 获取浏览器信息 if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) { fileName = new String(fileName.getBytes("GB2312"),"ISO-8859-1"); } else { // 处理中文文件名的问题 fileName = java.net.URLEncoder.encode(fileName, "UTF-8"); fileName = new String(fileName.getBytes("UTF-8"), "GBK"); } // 清除首部的空白行 response.reset(); // 设置Response容器的编码 response.setCharacterEncoding("UTF-8"); // 不同类型的文件对应不同的MIME类型 response.setContentType("application/x-msdownload"); response.setHeader("Content-Disposition","attachment; filename="+fileName); } /** * 解压ZIP * @param inputStream 压缩文件流 * @param unzipDir 解压目录 */ public static void unzipWithStream(InputStream inputStream, String unzipDir) { if (!unzipDir.endsWith(File.separator)) { unzipDir = unzipDir + File.separator; } try (ZipInputStream zipInputStream = new ZipInputStream(inputStream, Charset.forName("UTF-8"))) { ZipEntry zipEntry; while ((zipEntry = zipInputStream.getNextEntry()) != null) { String zipEntryNameStr = zipEntry.getName(); String zipEntryName = zipEntryNameStr; if (zipEntryNameStr.contains("/")) { String str1 = zipEntryNameStr.substring(0, zipEntryNameStr.indexOf("/")); zipEntryName = zipEntryNameStr.substring(str1.length() + 1); } String outPath = (unzipDir + zipEntryName).replace("\\\\", "/"); File outFile = new File(outPath.substring(0, outPath.lastIndexOf('/'))); if (!outFile.exists()) { outFile.mkdirs(); } if (new File(outPath).isDirectory()) { continue; } writeFile(outPath, zipInputStream); zipInputStream.closeEntry(); } } catch (IOException e) { log.error("压缩包处理异常,异常信息{}" + e); } } ​ //将流写到文件中 public static void writeFile(String filePath, ZipInputStream zipInputStream) { try (OutputStream outputStream = new FileOutputStream(filePath)) { byte[] bytes = new byte[4096]; int len; while ((len = zipInputStream.read(bytes)) != -1) { outputStream.write(bytes, 0, len); } outputStream.close(); } catch (IOException e) { log.error("解压文件时,写出到文件出错{}" + e); } } ​ }

不积跬步,无以至千里;不积小流,无以成江海。您学会了吗?如果您喜欢就点个赞呗!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有