通过GZIPOutputStream,GZIPInputStream可以方便的对数据进行压缩,本以为很简单的代码,写好运行居然报错:
Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:223)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:141)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:92)
at java.io.FilterInputStream.read(FilterInputStream.java:90)
at Main.main(Main.java:25)
代码很简单:
ByteArrayOutputStream out = new ByteArrayOutputStream(); GZIPOutputStream gzip = new GZIPOutputStream(out); gzip.write("testlalala2389223423sdfds383274llalall".getBytes()); byte[] data = out.toByteArray(); GZIPInputStream gunzip = new GZIPInputStream(new ByteArrayInputStream(data)); data = new byte[gunzip.available()]; gunzip.read(data);
打点分析:
System.out.println("data_length "+data.length);
System.out.println("data_available "+gunzip.available());
data_length 10
data_available 1
原因:
1.没有 gzip.close();
2. gunzip.available()不能获取正确的数据,改成while
完整的代码:
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; public class Main { public static void main(String[] args) throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); GZIPOutputStream gzip = new GZIPOutputStream(out); gzip.write("testlalala23892234分詞誒四是23sdfds383274llalall".getBytes("utf-8")); gzip.close(); byte[] data = out.toByteArray(); System.out.println("data_length " + data.length); GZIPInputStream gunzip = new GZIPInputStream(new ByteArrayInputStream(data)); System.out.println("data_available " + gunzip.available()); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[256]; int n; while ((n = gunzip.read(buffer)) >= 0) { outStream.write(buffer, 0, n); } System.out.println(outStream.toString("utf-8")); } }