如何清空DeflatorOutputStream中的缓冲数据

3

我希望能够清空DeflaterOutputStream中的任何未处理数据,并在InflaterInputStream中读取它。 然而,似乎flush()方法并不能做到这一点。 有其他的方法吗?

ByteArrayOutputStream baos = new ByteArrayOutputStream();
DeflaterOutputStream dos = new DeflaterOutputStream(baos);

for(char ch = 'a';ch <= 'z';ch ++) {
    dos.write(ch);
    dos.flush();
    System.out.println("compressed size = "+baos.toByteArray().length);
}
dos.close();
System.out.println("After close, compressed size = "+baos.toByteArray().length);

我希望看到的是每次刷新时大小都会增加,因为它会刷新任何未处理/缓冲的数据。然而,实际情况并非如此。它只会一直保留在缓冲区中,直到我关闭流。

compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
compressed size = 2
After close, compressed size = 34

如果DeflaterOutputStream不支持此功能,是否有其他支持压缩的流可以使用?
我已经查看了Apache Commons Compress,唯一能够刷新数据的流是XZCompressorInputStream,但这样做会使数据比不压缩时大约增加50%。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
XZCompressorOutputStream dos = new XZCompressorOutputStream(baos);

for (char ch = 'a'; ch <= 'z'; ch++) {
    dos.write(("Hello world").getBytes());
    baos2.write(("Hello world").getBytes());
    dos.flush();
    System.out.println("compressed size = " + baos.toByteArray().length);
}
dos.close();
System.out.println("After close, compressed size = " + baos.toByteArray().length);
System.out.println("uncompressed size = " + baos2.toByteArray().length);

最后打印结果。
compressed size = 388
After close, compressed size = 424
uncompressed size = 286
1个回答

3

我应该先阅读Javadoc。构造函数syncFlush有一个选项,如果为true,会给出我想要的行为。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
DeflaterOutputStream dos = new DeflaterOutputStream(baos, true);

for (char ch = 'a'; ch <= 'z'; ch++) {
    dos.write(("Hello world").getBytes());
    baos2.write(("Hello world").getBytes());
    dos.flush();
    System.out.println("compressed size = " + baos.toByteArray().length);
}
dos.close();
System.out.println("After close, compressed size = " + baos.toByteArray().length);
System.out.println("uncompressed size = " + baos2.toByteArray().length);

最终打印

compressed size = 212
compressed size = 220
After close, compressed size = 226
uncompressed size = 286

注意:此功能仅在Java 7中添加,而我正在查看Java 6。

遇到了同样的问题。该死的Java 6兼容性问题! - pveentjer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接