ZIP64支持-Zip64
# 📚简介
Zip64是Hutool压缩模块中用于支持Excel兼容的Zip64实现的类。它主要用于处理大文件的ZIP压缩,特别是针对Excel文件的兼容处理。该类来自于rzymek/opczip (opens new window)项目,提供了对Zip64格式的支持,允许处理超过4GB的大文件和超过65535个条目的ZIP文件。
# 🏗️核心结构
# 1. 类定义
class Zip64 {
private static final long PK0102 = 0x02014b50L;
private static final long PK0304 = 0x04034b50L;
private static final long PK0506 = 0x06054b50L;
private static final long PK0708 = 0x08074b50L;
private static final int VERSION_20 = 20;
private static final int VERSION_45 = 45;
private static final int DATA_DESCRIPTOR_USED = 0x08;
private static final int ZIP64_FIELD = 0x0001;
private static final long MAX32 = 0xffffffffL;
private final OutputStream out;
private int written = 0;
// Entry内部类
static class Entry {
final String filename;
long crc;
long size;
int compressedSize;
int offset;
// ...
}
// 构造方法和其他方法
// ...
}
# 2. 核心常量
| 常量名 | 值 | 描述 |
|---|---|---|
PK0102 | 0x02014b50L | ZIP文件中央目录文件头签名 |
PK0304 | 0x04034b50L | ZIP文件本地文件头签名 |
PK0506 | 0x06054b50L | ZIP文件中央目录结束签名 |
PK0708 | 0x08074b50L | ZIP文件数据描述符签名 |
VERSION_20 | 20 | ZIP版本2.0 |
VERSION_45 | 45 | ZIP版本4.5,支持Zip64 |
DATA_DESCRIPTOR_USED | 0x08 | 标记使用数据描述符 |
ZIP64_FIELD | 0x0001 | Zip64字段标记 |
MAX32 | 0xffffffffL | 32位最大整数值,超过此值需要Zip64支持 |
# 3. 内部类 Entry
Entry类用于表示ZIP文件中的一个条目,包含以下字段:
| 字段名 | 类型 | 描述 |
|---|---|---|
filename | String | 文件名 |
crc | long | CRC32校验值 |
size | long | 未压缩大小 |
compressedSize | int | 压缩大小 |
offset | int | 本地文件头偏移量 |
# 🔧 API说明
# 1. 构造方法
# Zip64(OutputStream out)
创建Zip64实例,用于写入ZIP文件。
参数说明:
out:输出流,用于写入ZIP数据
# 2. 核心方法
# writeLFH(Entry entry)
写入本地文件头(Local File Header)。
参数说明:
entry:ZIP条目对象
返回值:
- 写入的字节数
异常:
IOException:IO异常
# writeDAT(Entry entry)
写入数据描述符(Data Descriptor)。
参数说明:
entry:ZIP条目对象
返回值:
- 写入的字节数
异常:
IOException:IO异常
# writeCEN(Entry entry)
写入中央目录文件头(Central Directory Entry)。
参数说明:
entry:ZIP条目对象
返回值:
- 写入的字节数
异常:
IOException:IO异常
实现逻辑:
- 检查条目大小是否超过32位最大值
- 如果超过,启用Zip64字段
- 写入中央目录文件头
- 如果启用了Zip64,写入额外的Zip64字段
# writeEND(int entriesCount, int offset, int length)
写入中央目录结束记录(End of Central Directory Record)。
参数说明:
entriesCount:条目数量offset:中央目录偏移量length:中央目录长度
返回值:
- 写入的字节数
异常:
IOException:IO异常
# 3. 辅助方法
# writeShort(int v)
以小端字节序写入16位短整数。
# writeInt(long v)
以小端字节序写入32位整数。
# writeLong(long v)
以小端字节序写入64位长整数。
# 🎯 设计优势
# 1. 支持大文件处理
- 支持超过4GB的大文件压缩
- 支持超过65535个条目的ZIP文件
- 解决了传统ZIP格式的32位限制
# 2. Excel兼容
- 专门为Excel文件设计的Zip64实现
- 确保生成的ZIP文件能够被Excel正确识别
- 兼容各种Excel版本
# 3. 高效的实现
- 直接操作底层输出流,减少内存占用
- 小端字节序写入,符合ZIP格式规范
- 优化的写入逻辑,提高性能
# 4. 完整的ZIP格式支持
- 支持本地文件头、数据描述符、中央目录文件头和中央目录结束记录
- 正确处理Zip64扩展字段
- 符合ZIP文件格式规范
# 📌 注意事项
# 1. 包可见性
Zip64类是包级可见的,外部无法直接访问- 主要供Hutool内部的压缩模块使用
- 不建议外部直接使用该类
# 2. 输出流管理
- 不负责关闭传入的输出流
- 使用完毕后需要手动关闭输出流
- 建议使用try-with-resources语句管理输出流
# 3. 数据完整性
- 依赖外部计算CRC32值和文件大小
- 确保传入的Entry对象包含正确的CRC32值和大小信息
- 否则可能导致生成的ZIP文件损坏
# 4. 兼容性考虑
- 主要针对Excel文件进行了优化
- 对于其他类型的ZIP文件,可能不是最优选择
- 建议根据实际需求选择合适的ZIP实现
# 🔄 与传统ZIP实现的对比
# 1. 传统ZIP实现的限制
- 单个文件大小不能超过4GB
- 整个ZIP文件大小不能超过4GB
- 最多只能包含65535个条目
- 不支持Zip64扩展字段
# 2. Zip64实现的优势
- 支持单个文件大小超过4GB
- 支持整个ZIP文件大小超过4GB
- 支持超过65535个条目
- 正确处理Zip64扩展字段
- Excel兼容,确保生成的ZIP文件能被Excel正确识别