java ZipFile如何将多级目录压缩
更新时间:2024年08月26日 09:18:29 作者:爱穿衬衫的张某某
这篇文章主要介绍了java ZipFile如何将多级目录压缩问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
java ZipFile将多级目录压缩
在 Java 中,可以使用 java.util.zip 包中的 ZipOutputStream 和 ZipEntry 类来压缩多级目录。
一个例子
展示如何递归地将一个目录及其所有子目录和文件压缩到一个 ZIP 文件中:
import java.io.*; import java.nio.file.*; import java.util.zip.*; public class ZipDirectory { public static void main(String[] args) throws IOException { String sourceDirPath = "path/to/source/directory"; String zipFilePath = "path/to/output.zip"; try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath))) { Path sourceDir = Paths.get(sourceDirPath); Files.walk(sourceDir) .filter(path -> !Files.isDirectory(path)) .forEach(path -> { ZipEntry zipEntry = new ZipEntry(sourceDir.relativize(path).toString()); try { zipOut.putNextEntry(zipEntry); Files.copy(path, zipOut); zipOut.closeEntry(); } catch (IOException e) { System.err.println("Failed to add file to ZIP: " + path); e.printStackTrace(); } }); } } }
这个程序将遍历指定目录(包括子目录)的所有文件,并将它们添加到 ZIP 文件中。
步骤解析
- 使用 Files.walk 方法递归遍历源目录。
- 对于每个非目录文件,创建一个相对路径的 ZipEntry。
- 将文件内容复制到 ZipOutputStream。
请根据实际情况替换 sourceDirPath 和 zipFilePath。此外,请确保适当处理异常并关闭资源以避免资源泄漏。
Java多级目录导出文件压缩包
//创建临时文件 File zipFile = File.createTempFile("test", ".zip"); Path temp = Files.createTempDirectory(null); String srcImgPath = temp.toString(); for( 循环 ){ String outImgPath = srcImgPath + "/aa/bb/cc"; File outImgFile = new File(outImgPath); //如果文件夹不存在则创建 if (!outImgFile.exists() && !outImgFile.isDirectory()) { outImgFile.mkdirs(); } FileOutputStream outImgStream = new FileOutputStream(outImgPath + "/" + name); ImageIO.write(bufImg, imgSuffix, outImgStream); outImgStream.flush(); outImgStream.close(); } ZipUtil.zip(srcImgPath, zipFile.getAbsolutePath(), true); String header = request.getHeader("User-Agent").toUpperCase(); String fileName = "附件信息" + System.currentTimeMillis() + ".zip"; if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) { fileName = URLEncoder.encode(fileName, "utf-8"); //IE下载文件名空格变+号问题 fileName = fileName.replace("+", "%20"); } else { fileName = new String(fileName.getBytes(), "ISO8859-1"); } response.reset(); response.setContentType("text/plain"); response.setContentType("application/octet-stream; charset=utf-8"); response.setHeader("Location", fileName); response.setHeader("Cache-Control", "max-age=0"); response.setHeader("Content-Disposition", "attachment; filename=" + fileName); FileInputStream fis = new FileInputStream(zipFile); BufferedInputStream buff = new BufferedInputStream(fis); BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream()); byte[] car = new byte[1024]; int l = 0; while (l < zipFile.length()) { int j = buff.read(car, 0, 1024); l += j; out.write(car, 0, j); } // 关闭流 fis.close(); buff.close(); out.close(); // 删除临时文件 zipFile.delete(); FileUtil.deleteDir(srcImgPath);
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
spring中12种@Transactional的失效场景(小结)
日常我们进行业务开发时,基本上使用的都是声明式事务,即为使用@Transactional注解的方式,本文主要介绍了spring中12种@Transactional的失效场景,感兴趣的小伙伴们可以参考一下2022-01-01java实现将字符串中首字母转换成大写,其它全部转换成小写的方法示例
这篇文章主要介绍了java实现将字符串中首字母转换成大写,其它全部转换成小写的方法,涉及java字符串遍历、转换、拼接等相关操作技巧,需要的朋友可以参考下2019-06-06
最新评论