RFC 1952 第2.3.1节规定,GZIP头文件必须包含以下内容 OS
旗。
OS
(操作系统). 这标识了进行压缩的文件系统的类型。 这可能有助于确定文本文件的行末惯例。目前定义的值如下。
0 - FAT filesystem (MS-DOS, OS/2, NT/Win32)
1 - Amiga
2 - VMS (or OpenVMS)
3 - Unix
4 - VM/CMS
5 - Atari TOS
6 - HPFS filesystem (OS/2, NT)
7 - Macintosh
8 - Z-System
9 - CP/M
10 - TOPS-20
11 - NTFS filesystem (NT)
12 - QDOS
13 - Acorn RISCOS
255 - unknown
然而,Java的GZIP序列化在所有情况下都会写一个零,如在 GzipOutputStream.java的第193行。. 我在四个不同的操作系统上进行了测试,确认写完后没有其他代码修改这个头。
为什么这个值是硬编码的?
正如Elliott所指出的,根据你所引用的同一RFC的2.3.1.2节,将其设置为默认值是可以的。
合规的压缩器必须以正确的ID1、ID2、CM、CRC32和ISIZE生成文件,但可以将头的固定长度部分的所有其他字段设置为默认值(OS为255,所有其他字段为0)。压缩器必须将所有保留位设置为0。
然而,根据这个片段,默认值仍然是不正确的--默认值为 OS
标志是255,而不是0。这是一个 已知错误 在JDK中,根据 JDK-8244706.