在重置 ByteArrayOutputStream 后刷新 GZIPOutputStream 是否安全?

Is it safe to flush a GZIPOutputStream followed by a ByteArrayOutputStream reset?

这是一个示例代码

ByteArrayOutputStream baos = new ByteArrayOutputStream(bufSize);
GZIPOutputStream gzos = new GZIPOutputStream1(baos);
gzos.write(...)
...
gzos.write(...)
...
// Would the content get flushed properly?
gzos.flush()
byte[] bytes =  baos.toByteArray();
// Use bytes wherever you want
...
// Would this reset things for gzos?
baos.reset()
gzos.write(...)
...
gzos.write(...)
...
bytes =  baos.toByteArray();
...

所以,一旦某个地方使用了压缩字节数组,我想重置流。我有两个顾虑。我在某处读到 GZIPOutputStream 的刷新方法不一定总是刷新内容? Java 7 仍然如此吗?如果可行,调用 ByteArrayOutputStream 对象的重置是否足以重置 GZIPOutputStream 对象的内容?

I read somewhere that GZIPOutputStream's flush method do not necessarily always flushes the content?

这取决于您使用的 GZIPOutputStream 构造函数。如果您创建一个将 true 传递给 boolean syncFlush 的压缩器,任何 flush() 调用将分别刷新压缩器和输出流。如果false,只有输出strem会刷新。

Is that true still for Java 7?

您描述的行为发生在 Java 6 中。此 syncFlush 参数自 Java 7 起可用。当然,它在 Java 8 中可用。

If that works, is calling reset of the ByteArrayOutputStream object enough to reset things for the GZIPOutputStream object?

是的,好像是。