我没有找到工作的另一个答案。它仍然拒绝刷新,因为GZIPOutputStream使用的本机代码保留在数据上。
值得庆幸的是,我发现有人已经实现了一个FlushableGZIPOutputStream作为Apache Tomcat项目的一部分。这是神奇的部分:
@Override
public synchronized void flush() throws IOException {
if (hasLastByte) {
// - do not allow the gzip header to be flushed on its own
// - do not do anything if there is no data to send
// trick the deflater to flush
/**
* Now this is tricky: We force the Deflater to flush its data by
* switching compression level. As yet, a perplexingly simple workaround
* for
* http://developer.java.sun.com/developer/bugParade/bugs/4255743.html
*/
if (!def.finished()) {
def.setLevel(Deflater.NO_COMPRESSION);
flushLastByte();
flagReenableCompression = true;
}
}
out.flush();
}
你可以在这个罐子中找到整个类(如果你使用Maven):
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-coyote</artifactId>
<version>7.0.8</version>
</dependency>
或者只是去获取源代码 FlushableGZIPOutputStream.java
它是在Apache-2.0许可证下发布的。