Я обнаружил, что при использовании Java .util.zip.GzipOutputStream, когда я сначала вызывал flu sh (), а затем close (). Дефлятор всегда создает два байта («00» и «03» в шестнадцатеричном формате) перед записью трейлера. Что означают эти два байта? Почему flu sh () не выполняет flu sh всех байтов в компрессоре? Я уже установил для потока syncFlu sh значение true. (В моем случае мне нужно вызвать flu sh поток)
Это тестовый код, который я пишу.
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();
И я запускаю hexdump -C gtest.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' всегда будут создаваться независимо от того, какой контент я изменяю.