输入的字符串为php的gzencode压缩的字符串,可以用gzdecode解开,但是用java的java.util.zip.GZIPInputStream读入字符串时,总是提示:
java.util.zip.ZipException: Not in GZIP format
希望有经验的朋友帮我解答一下,我的代码如下:
JAVA
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class Gzdecode {
public static void decompress(InputStream is, OutputStream os)
throws Exception {
GZIPInputStream gis = new GZIPInputStream(is);
int count;
byte data[] = new byte[BUFFER];
while ((count = gis.read(data, 0, BUFFER)) != -1) {
os.write(data, 0, count);
}
gis.close();
}
public static byte[] decompress(byte[] data) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 解压缩
decompress(bais, baos);
data = baos.toByteArray();
baos.flush();
baos.close();
bais.close();
return data;
}
public static void main(String[] args) throws Exception
{
String input="";
byte[] data=input.getBytes("UTF-8");
byte[] data_decompress=decompress(data);
System.out.write(data_decompress);
我不是很清楚php的gzencode的原理,不过java的GZIPInputStream会检查头部是否两个字节0x8b1f(魔数)。如果不是,就会抛这个错, 还有你的程序有个明显的错误
byte[] data=input.getBytes("UTF-8"); //这里并不是把你输入的8B1F转成2个bytes的数组,而是转成四个byte对应的56,66,49,70
//,你需要的是一个装换字符成byte的类,提醒一下apache common codec有这个API
// http://commons.apache.org/proper/commons-codec/download_codec.cgi
//你也可以自己写一个