在使用
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(msg);//msg是一个byte[]
GZIPInputStream gzipInputStream = new GZIPInputStream(byteArrayInputStream);
的时候,调用
gzipInputStream.read(buff)
的时候会报Unexpected end of ZLIB input stream,导致异常的原因是由于Buffer的大小不匹配造成的。查看GZIPInputStream的源代码可知:
/**
* Creates a new input stream with the specified buffer size.
* @param in the input stream
* @param size the input buffer size
*
* @exception ZipException if a GZIP format error has occurred or the
* compression method used is unsupported
* @exception IOException if an I/O error has occurred
* @exception IllegalArgumentException if size is <= 0
*/
public GZIPInputStream(InputStream in, int size) throws IOException {
super(in, new Inflater(true), size);
readHeader(in);
}
/**
* Creates a new input stream with a default buffer size.
* @param in the input stream
*
* @exception ZipException if a GZIP format error has occurred or the
* compression method used is unsupported
* @exception IOException if an I/O error has occurred
*/
public GZIPInputStream(InputStream in) throws IOException {
this(in, 512);
}
只写一个参数的情况下调用的是第二个构造方法,也就是默认buffer的长度是512。因此有两种解决方法:
1.使用上面一个构造方法,指定buffer的长度,使用的时候也使用这么长的buffer去读数据
2.把自己的buffer的长度设定为默认长度512
因此在使用的时候,代码就变为:
int bufferSize = 1024;
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(msg);
GZIPInputStream gzipInputStream = new GZIPInputStream(byteArrayInputStream, bufferSize);
byte[] buff = new byte[bufferSize];