简介
# 📚简介
Hutool的压缩模块提供了丰富的压缩和解压缩功能,是对JDK java.util.zip 包的工具化封装,旨在简化压缩操作,提高开发效率。该模块支持多种压缩格式,包括ZIP、GZIP、DEFLATE等,提供了便捷的API,让开发者可以用更少的代码完成复杂的压缩任务。
# 🏗️核心结构
# 1. 模块划分
| 类型 | 名称 | 主要职责 |
|---|---|---|
| 工具类 | ZipUtil | ZIP压缩和解压缩的核心工具类 |
| 流处理 | Gzip | GZIP压缩和解压缩工具 |
| 流处理 | Deflate | DEFLATE压缩和解压缩工具 |
| 流处理 | InflaterInputStream | 增强的Inflater输入流 |
| ZIP操作 | ZipReader | ZIP文件读取器 |
| ZIP操作 | ZipWriter | ZIP文件写入器 |
| ZIP操作 | ZipReplacer | ZIP文件内容替换工具 |
| ZIP资源 | ZipResource | ZIP资源抽象 |
| ZIP资源 | ZipFileResource | 文件型ZIP资源 |
| ZIP资源 | ZipStreamResource | 流型ZIP资源 |
| ZIP扩展 | Zip64 | ZIP64支持工具 |
| ZIP扩展 | OpcZipOutputStream | OPC格式ZIP输出流 |
| ZIP扩展 | ZipCopyVisitor | ZIP复制访问器 |
| 安全工具 | ZipSecurityUtil | ZIP安全工具 |
# 2. JDK java.util.zip 简介
JDK的 java.util.zip 包提供了基本的压缩和解压缩功能,包括:
- 核心类:
ZipInputStream、ZipOutputStream、GZIPInputStream、GZIPOutputStream、Deflater、Inflater等 - 功能:支持ZIP、GZIP、DEFLATE等压缩格式
- 特点:提供了底层的流处理API,功能强大但使用复杂
- 不足:
- API设计较为底层,需要开发者处理大量流操作细节
- 异常处理繁琐,容易出现资源泄漏
- 代码冗长,开发效率低
- 缺乏高级功能支持,如ZIP64、文件替换等
# 🎯 工具化封装的意义
Hutool对 java.util.zip 进行工具化封装的主要意义在于:
- 简化API:提供简洁易用的API,减少样板代码
- 资源管理:自动处理流的打开和关闭,避免资源泄漏
- 异常处理:统一处理异常,简化错误处理逻辑
- 功能增强:扩展了JDK的压缩功能,如ZIP64支持、文件替换等
- 提高效率:减少开发者的学习成本和开发时间
- 统一接口:为不同的压缩格式提供统一的操作接口
# 🔧 如何简化操作
# 1. 传统JDK方式(复杂)
// 创建ZIP文件
String zipFilePath = "test.zip";
String sourceDirPath = "source";
try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFilePath))) {
File sourceDir = new File(sourceDirPath);
File[] files = sourceDir.listFiles();
for (File file : files) {
if (file.isFile()) {
ZipEntry zipEntry = new ZipEntry(file.getName());
zos.putNextEntry(zipEntry);
try (FileInputStream fis = new FileInputStream(file)) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
}
zos.closeEntry();
}
}
} catch (IOException e) {
e.printStackTrace();
}
# 2. Hutool方式(简洁)
// 创建ZIP文件
String zipFilePath = "test.zip";
String sourceDirPath = "source";
// 一行代码完成ZIP压缩
ZipUtil.zip(sourceDirPath, zipFilePath);
# 3. 更多简化示例
# 解压ZIP文件
// 传统方式:需要处理流、异常等
// Hutool方式:一行代码
ZipUtil.unzip("test.zip", "output");
# 创建GZIP文件
// 传统方式:需要处理GZIPOutputStream、FileOutputStream等
// Hutool方式:一行代码
Gzip.zip("source.txt", "source.txt.gz");
# 读取ZIP文件内容
// 传统方式:需要遍历ZipEntry,处理流等
// Hutool方式:简洁API
try (ZipReader reader = ZipUtil.reader("test.zip")) {
// 读取所有条目
List<ZipEntry> entries = reader.getEntries();
// 读取指定文件内容
String content = reader.readStr("test.txt");
}
# 🚀 快速开始
# 1. ZIP压缩示例
// 压缩单个文件
ZipUtil.zip("source.txt", "source.zip");
// 压缩多个文件
ZipUtil.zip("output.zip", false, "file1.txt", "file2.txt");
// 压缩目录
ZipUtil.zip("sourceDir", "sourceDir.zip");
// 压缩目录并排除指定文件
ZipUtil.zip("sourceDir", "sourceDir.zip", path -> !path.endsWith(".tmp"));
# 2. ZIP解压示例
// 解压到指定目录
ZipUtil.unzip("source.zip", "outputDir");
// 解压到当前目录
ZipUtil.unzip("source.zip");
// 解压指定文件
ZipUtil.unzipFile("source.zip", "outputDir", "file.txt");
# 3. GZIP压缩解压示例
// GZIP压缩
Gzip.zip("source.txt", "source.txt.gz");
// GZIP解压
Gzip.unzip("source.txt.gz", "source.txt");
# 🎯 设计优势
- 简洁易用:提供了简洁的API,一行代码即可完成复杂的压缩解压操作
- 功能全面:支持多种压缩格式,包括ZIP、GZIP、DEFLATE等
- 资源安全:自动处理流的打开和关闭,避免资源泄漏
- 异常友好:统一处理异常,简化错误处理逻辑
- 扩展丰富:提供了ZIP64支持、文件替换等高级功能
- 性能优异:底层实现经过优化,性能优异
- 线程安全:所有工具类都是线程安全的,可以在多线程环境下安全使用
# 📌 注意事项
- 文件大小:对于超大文件,建议使用流处理方式,避免内存溢出
- 编码问题:ZIP文件名默认使用UTF-8编码,如需其他编码请指定
- 性能考虑:压缩操作可能会消耗较多CPU和内存资源,建议在后台线程中执行
- 版本兼容性:不同版本的JDK对压缩算法的实现可能有所不同,注意版本兼容性
- 安全问题:处理不可信的ZIP文件时,注意防范ZIP炸弹等安全风险