java ZipFile如何将多级目录压缩
作者:爱穿衬衫的张某某
这篇文章主要介绍了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);
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。