如果先调用flush()然后关闭,为什么Java gziOutputStream总是在尾部之前写入两个字节03 00?

如果先调用flush()然后关闭,为什么Java gziOutputStream总是在尾部之前写入两个字节03 00?,java,gzip,gzipoutputstream,Java,Gzip,Gzipoutputstream,我发现在使用Java.util.zip.GzipOutputStream时,首先调用flush()然后调用close()。在写入预告片之前,平减指数始终产生两个字节(“00”和“03”十六进制)。这两个字节是什么意思?为什么flush()不刷新压缩器中的所有字节?我已经将流syncFlush设置为true。(在我的用例中,我需要强制刷新流) 这是我写的测试代码 File file = new File("gtest.gz"); OutputStream out =

我发现在使用Java.util.zip.GzipOutputStream时,首先调用flush()然后调用close()。在写入预告片之前,平减指数始终产生两个字节(“00”和“03”十六进制)。这两个字节是什么意思?为什么flush()不刷新压缩器中的所有字节?我已经将流syncFlush设置为true。(在我的用例中,我需要强制刷新流)

这是我写的测试代码

        File file = new File("gtest.gz");
        OutputStream out = new FileOutputStream(file);
        GZIPOutputStream gzipOutputStream = new GZIPOutputStream(out, true);
                gzipOutputStream.write("Each gzip file generated by JAVA GzipOutputStream has byte '0003' before Trailer"
                 .getBytes());
        gzipOutputStream.flush();
        gzipOutputStream.close();
我运行
hextump-cgtest.gz
get

00000000  1f 8b 08 00 00 00 00 00  00 00 72 4d 4c ce 50 48  |..........rML.PH|
00000010  af ca 2c 50 48 cb cc 49  55 48 4f cd 4b 2d 4a 2c  |..,PH..IUHO.K-J,|
00000020  49 4d 51 48 aa 54 f0 72  0c 73 54 70 07 ca f9 97  |IMQH.T.r.sTp....|
00000030  96 14 94 96 04 97 14 a5  26 e6 2a 64 24 16 03 25  |........&.*d$..%|
00000040  4b 52 15 d4 0d 0c 0c 8c  d5 15 92 52 d3 f2 8b 52  |KR.........R...R|
00000050  15 42 8a 12 81 06 14 01  00 00 00 ff ff 03 00 96  |.B..............|
00000060  ef 3b 5d 50 00 00 00                              |.;]P...|
00000067

最后8个字节是Gzip的尾部,“03”“00”之前的两个字节将始终生成我更改的任何内容。

似乎有相同的问题,但没有人知道:)这在姐妹网站“反向工程”上得到了回答: