Zip文件的Java库在getExtra()
的ZipEntry
中有一个选项,可以返回byte[]
或null
。 ZipEntry中用于额外的字节是什么?我知道this question关于链接到getExtra()
的存档属性,但没有解释该字段还用于什么用途。此外,该问题表明,无法通过Java设置多余字段中存储的某些内容。
答案 0 :(得分:0)
答案可以在the java.util.zip package documentation的前两个链接中找到。
the PKWARE zip specification中描述了基本的zip格式。 4.5和4.6节描述了额外的数据。
额外数据是一系列零个或多个块。每个块均以低端16位ID开始,然后是紧随其后的字节的低端16位计数。
PKWARE规范描述了一些众所周知的额外数据记录ID。 Info-Zip format描述了更多。
因此,如果要检查zip条目是否包含ASi Unix Extra域,则可以这样阅读:
ByteBuffer extraData = ByteBuffer.wrap(zipEntry.getExtra());
extraData.order(ByteOrder.LITTLE_ENDIAN);
while (extraData.hasRemaining()) {
int id = extraData.getShort() & 0xffff;
int length = extraData.getShort() & 0xffff;
if (id == 0x756e) {
int crc32 = extraData.getInt();
short permissions = extraData.getShort();
int linkLengthOrDeviceNumbers = extraData.getInt();
int userID = extraData.getChar();
int groupID = extraData.getChar();
ByteBuffer linkDestBuffer = extraData.slice().limit(length - 14);
String linkDestination =
StandardCharsets.UTF_8.decode(linkDestBuffer).toString();
// ...
} else {
extraData.position(extraData.position() + length);
}
}