在java中解压缩gzip输入流时出现“不是gzip格式”错误

时间:2014-01-28 07:46:54

标签: java gzip compression

我的代码正在尝试解压缩从gzip压缩文件中读取的输入流。

以下是代码段:

   InputStream is = new GZIPInputStream(new ByteArrayInputStream(fcontents.getBytes()));

文件本身很好:

$cat storefront3.gz  | gunzip
180028796
80026920
180028796
180026921
8002790180
800001
1800002
1800007
800008
800009

通过FileInputStream在顶部代码片段之前读取的数据肯定看起来像gzip的东西(注意原始文件是storefront3.tsv):

��[�Rstorefront3.tsvu���0k{)�?�/FBģ��Y'��Q�a���s~���}6���d�{2+���O���D�m~�O��

但请注意以下事项:

Caused by: java.io.IOException: Not in GZIP format
    at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:141)
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:56)
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:65)

这是.gz文件的十六进制转储

23:40:44/storefronts:72 $od -cx  storefront3.gz
0000000  037 213  \b  \b 201   [ 347   R  \0 003   s   t   o   r   e   f
             8b1f    0808    5b81    52e7    0300    7473    726f    6665
0000020    r   o   n   t   3   .   t   s   v  \0   u 212 273 025 200   0
             6f72    746e    2e33    7374    0076    8a75    15bb    3080
0000040   \f 003   k   { 032   ) 200   ? 373   /   F   B   ģ  ** 302 131
             030c    7b6b    291a    3f80    2ffb    4246    a3c4    cdc2
0000060    Y   ' 261 200   Q 331   a 276 276 350 001   s   ~ 222 262 175
             2759    80b1    d951    be61    e8be    7301    927e    dcb2
0000100    }   6 226 231 367   d 200   {   2   + 211 337 342 020   O 022
             367d    9996    64f7    7b80    2b32    df89    10e2    f14f
0000120  022 343 035 246   D 211   m   ~ 003 326   O 235 030 236  \0  \0
             e312    a61d    8944    7e6d    d603    9d4f    9e18    0000
0000140   \0
             0000

更新

我也试过使用FileInputStream。以下给出了相同的错误

      GZIPInputStream strm = new GZIPInputStream(new FileInputStream(tmpFileName));

1 个答案:

答案 0 :(得分:3)

由于fcontents包含您的gzip压缩数据,因此它应该是byte[]而不是String

我建议使用IOUtils将文件读入字节数组,因为将其读入字符串很可能会损坏您的数据。