【问题标题】:How do I flush the buffered data in a DeflatorOutputStream如何刷新 DeflaterOutputStream 中的缓冲区数据
【发布时间】:2013-09-12 12:50:05
【问题描述】:

我希望能够刷新 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

【问题讨论】:

    标签: java flush deflate


    【解决方案1】:

    我应该阅读 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 兼容性!
    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2021-09-03
    • 2018-07-11
    • 1970-01-01
    相关资源
    最近更新 更多