归咎于历史先例。在 Unix 上,该函数用于反转deflate
叫做inflate
。因此,与许多其他 Java IO 类不同,输入和输出流对没有(显然)匹配的名称。
DeflaterOutputStream 实际上不允许您反转紧缩,而是在字节从接收器传递到源时对字节进行紧缩。压缩器输入流also放气,但它会在数据从源流向接收器时执行其操作。
为了以未压缩(膨胀)格式读取数据,您需要使用InflaterInputStream
:
InflaterInputStream inputStream = new InflaterInputStream(arrayInputStream);
另外,因为有可能无法一次性从流中获取所有压缩数据read
调用时,需要使用循环。像这样的东西:
int read;
byte[] finalBuf = new byte[0], swapBuf;
byte[] readBuffer = new byte[5012];
ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(
compressed);
InflaterInputStream inputStream = new InflaterInputStream(
arrayInputStream);
while ((read = inputStream.read(readBuffer)) != -1) {
System.out.println("Intermediate read: " + read);
swapBuf = finalBuf;
finalBuf = new byte[swapBuf.length + read];
System.arraycopy(swapBuf, 0, finalBuf, 0, swapBuf.length);
System.arraycopy(readBuffer, 0, finalBuf, swapBuf.length, read);
}
最后,确保在检索压缩字节之前刷新压缩器输出流(或者关闭流)。