DEFLATE工具-Deflate
# 📚简介
Deflate类是Hutool压缩模块中用于处理DEFLATE压缩算法的工具类,它对JDK的DeflaterOutputStream和InflaterOutputStream进行了封装,提供了更简洁易用的API,简化了DEFLATE压缩和解压缩操作。
DEFLATE是一种同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的无损数据压缩算法,广泛应用于ZIP、GZIP等压缩格式中。
# 🏗️核心结构
# 1. 类定义
public class Deflate implements Closeable {
private final InputStream source;
private OutputStream target;
private final boolean nowrap;
// ...
}
# 2. 核心属性
| 属性名 | 类型 | 描述 |
|---|---|---|
source | InputStream | 源流,用于读取原始数据或压缩数据 |
target | OutputStream | 目标流,用于写入压缩数据或解压缩后的数据 |
nowrap | boolean | 是否使用 nowrap 模式,true表示兼容Gzip压缩 |
# 🔧 API说明
# 1. 创建Deflate实例
# of(InputStream source, OutputStream target, boolean nowrap)
创建Deflate实例,用于后续的压缩或解压缩操作。
参数说明:
source:源流,可以是普通输入流或压缩输入流target:目标流,可以是普通输出流或压缩输出流nowrap:true表示兼容Gzip压缩,不添加ZIP文件头和尾
返回值:
- Deflate实例,用于链式调用
# 2. 压缩操作
# deflater(int level)
将普通数据流压缩为DEFLATE格式。
参数说明:
level:压缩级别,取值范围0~9- 0:不压缩
- 1:最快压缩
- 9:最高压缩比
- 默认:5
返回值:
- Deflate实例,用于链式调用
实现逻辑:
- 如果目标流不是DeflaterOutputStream,则创建一个新的DeflaterOutputStream
- 设置指定的压缩级别
- 将源流的数据复制到目标流
- 调用finish()方法完成压缩
- 抛出IORuntimeException处理IO异常
# 3. 解压缩操作
# inflater()
将DEFLATE压缩流解压缩为普通数据流。
返回值:
- Deflate实例,用于链式调用
实现逻辑:
- 如果目标流不是InflaterOutputStream,则创建一个新的InflaterOutputStream
- 将源流的数据复制到目标流
- 调用finish()方法完成解压缩
- 抛出IORuntimeException处理IO异常
# 4. 资源关闭
# close()
关闭所有流资源,实现了Closeable接口。
实现逻辑:
- 静默关闭目标流和源流
- 使用IoUtil.closeQuietly()方法确保资源安全关闭
# 🚀 使用示例
# 1. DEFLATE压缩示例
// DEFLATE压缩文件
try (InputStream in = FileUtil.getInputStream("source.txt");
OutputStream out = FileUtil.getOutputStream("source.deflate")) {
Deflate.of(in, out, false).deflater(5);
Console.log("DEFLATE压缩完成!");
}
# 2. DEFLATE解压缩示例
// DEFLATE解压缩文件
try (InputStream in = FileUtil.getInputStream("source.deflate");
OutputStream out = FileUtil.getOutputStream("source.txt")) {
Deflate.of(in, out, false).inflater();
Console.log("DEFLATE解压缩完成!");
}
# 3. 链式调用示例
// 创建Deflate实例并立即执行压缩
try (InputStream in = FileUtil.getInputStream("source.txt");
OutputStream out = FileUtil.getOutputStream("source.deflate")) {
Deflate.of(in, out, false).deflater(9).close();
Console.log("DEFLATE最高级别压缩完成!");
}
# 4. 设置压缩级别的示例
// 测试不同压缩级别的效果
String sourceFile = "source.txt";
try (InputStream in = FileUtil.getInputStream(sourceFile)) {
byte[] sourceData = IoUtil.readBytes(in);
for (int level = 0; level <= 9; level++) {
try (InputStream in2 = new ByteArrayInputStream(sourceData);
ByteArrayOutputStream out = new ByteArrayOutputStream()) {
Deflate.of(in2, out, false).deflater(level);
byte[] compressed = out.toByteArray();
Console.log("压缩级别{} - 原始大小: {} 字节, 压缩后大小: {} 字节, 压缩率: {:.2f}%",
level, sourceData.length, compressed.length,
(1 - (double) compressed.length / sourceData.length) * 100);
}
}
}
# 5. nowrap参数的使用示例
// 使用nowrap=true创建兼容Gzip的DEFLATE压缩
try (InputStream in = FileUtil.getInputStream("source.txt");
OutputStream out = FileUtil.getOutputStream("source.deflate");
ByteArrayOutputStream gzipOut = new ByteArrayOutputStream()) {
// 使用nowrap=true压缩
Deflate.of(in, out, true).deflater(5);
// 可以直接用Gzip解压缩
try (InputStream deflateIn = FileUtil.getInputStream("source.deflate")) {
Gzip.of(deflateIn, gzipOut).unGzip();
Console.log("使用Gzip成功解压缩nowrap=true的DEFLATE数据!");
}
}
# 🎯 设计优势
# 1. 简洁易用的API
- 采用链式调用设计,代码更加简洁流畅
- 封装了复杂的压缩级别设置和流处理逻辑
- 统一的异常处理,避免了繁琐的try-catch代码
# 2. 灵活的压缩级别
- 支持0~9级压缩级别设置
- 可以根据实际需求在压缩速度和压缩比之间进行权衡
- 提供默认压缩级别(5级),适合大多数场景
# 3. nowrap模式支持
- 支持nowrap模式,兼容Gzip压缩格式
- 可以灵活选择是否添加ZIP文件头和尾
- 满足不同场景的压缩需求
# 4. 自动资源管理
- 实现了Closeable接口,可以配合try-with-resources使用
- 自动关闭流资源,避免资源泄漏
- 静默关闭流,不会抛出额外异常
# 5. 异常处理优化
- 将IOException转换为IORuntimeException,避免了受检异常的困扰
- 统一的异常类型,便于上层代码处理
- 提供了详细的异常信息,便于调试
# 📌 注意事项
# 1. 流的关闭
- 建议使用try-with-resources语句管理Deflate实例,确保资源正确关闭
- 如果不使用try-with-resources,需要手动调用close()方法
# 2. 压缩级别的选择
- 压缩级别越高,压缩率越高,但压缩速度越慢
- 压缩级别0表示不压缩,仅添加文件头和尾
- 对于需要快速压缩的场景,建议使用1~3级
- 对于需要高压缩比的场景,建议使用7~9级
- 默认级别5适合大多数场景,平衡了压缩速度和压缩比
# 3. nowrap参数的使用
- nowrap=true表示不添加ZIP文件头和尾,兼容Gzip格式
- nowrap=false表示添加标准的ZIP文件头和尾
- 如果需要与Gzip兼容,使用nowrap=true
- 如果需要标准的DEFLATE格式,使用nowrap=false
# 4. 性能考虑
- DEFLATE压缩会消耗一定的CPU资源,建议在后台线程中执行
- 对于超大文件,建议使用流式处理,避免一次性加载到内存
- 较高的压缩级别会消耗更多的CPU和内存资源
# 5. 与其他压缩格式的关系
- DEFLATE是GZIP和ZIP格式的基础压缩算法
- GZIP = DEFLATE + GZIP文件头和尾
- ZIP = DEFLATE + ZIP文件头和尾
Deflate类提供了更底层的压缩控制
# 🔄 与传统JDK方式的对比
# 1. 传统JDK方式(复杂)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
// 传统DEFLATE压缩方式
String sourceFile = "source.txt";
String targetFile = "source.deflate";
int compressionLevel = Deflater.BEST_COMPRESSION;
try (FileInputStream fis = new FileInputStream(sourceFile);
DeflaterOutputStream dos = new DeflaterOutputStream(
new FileOutputStream(targetFile),
new Deflater(compressionLevel, false))) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
dos.write(buffer, 0, len);
}
dos.finish();
Console.log("DEFLATE压缩完成!");
} catch (IOException e) {
e.printStackTrace();
}
# 2. Hutool方式(简洁)
import cn.hutool.v7.core.compress.Deflate;
import cn.hutool.v7.core.io.FileUtil;
import cn.hutool.v7.core.util.Console;
// Hutool DEFLATE压缩方式
String sourceFile = "source.txt";
String targetFile = "source.deflate";
int compressionLevel = 9; // 最高压缩级别
try (InputStream in = FileUtil.getInputStream(sourceFile);
OutputStream out = FileUtil.getOutputStream(targetFile)) {
Deflate.of(in, out, false).deflater(compressionLevel);
Console.log("DEFLATE压缩完成!");
}