Java中的gzinflate

时间:2012-07-09 16:33:40

标签: java php interop zlib

因此,我的Java应用程序会显示一些使用PHP的gzdeflate()生成的数据。 现在我正试图用Java来扩充这些数据。这是我到目前为止所得到的:

InflaterInputStream inflInstream = new InflaterInputStream(new ByteArrayInputStream(inputData.getBytes() ), new Inflater());

byte bytes[] = new byte[1024];
while (true) {
    int length = inflInstream.read(bytes, 0, 1024);
    if (length == -1)  break;

    System.out.write(bytes, 0, length);
}

'inputData'是一个包含泄漏数据的String。

问题是:.read方法抛出异常:

  

java.util.zip.ZipException:错误的标题检查

关于此主题的其他网站只会将我重定向到Inflater类的文档,但显然我不知道如何使用它来与PHP兼容。

2 个答案:

答案 0 :(得分:7)

根据documentation,php gzdeflate()生成原始deflate数据(RFC 1951),但Java Inflater class期待zlib(RFC 1950)数据,这是zlib头中包含的原始deflate数据和预告片。 除非,否则为Inflater构造函数指定nowrap as true。然后它将解码原始的deflate数据。

InputStream inflInstream = new InflaterInputStream(new ByteArrayInputStream(inputData.getBytes()), 
                                                   new Inflater(true));

byte bytes[] = new byte[1024];
while (true) {
    int length = inflInstream.read(bytes, 0, 1024);
    if (length == -1)  break;

    System.out.write(bytes, 0, length);
}

答案 1 :(得分:1)

根据示例使用GZIPInputStream(不要直接使用Inflater):

http://java.sun.com/developer/technicalArticles/Programming/compression/