【问题标题】:Why do you need `Flush` at all if `Close` is enough?如果 `Close` 就足够了,为什么还需要 `Flush`?
【发布时间】:2018-03-08 05:57:09
【问题描述】:

这就是我使用 gzip 编写器的方式。

    var b bytes.Buffer
    gz := gzip.NewWriter(&b)

    if _, err := gz.Write([]byte(data)); err != nil {
        panic(err)
    }

    /* 
    if err := gz.Flush(); err != nil {
        panic(err)
    }
    */

    if err := gz.Close(); err != nil {
        panic(err)
    }

游乐场链接https://play.golang.org/p/oafHItGOlDN

显然,Flush + CloseClose 给出了不同的结果。

Docs 对于 compress/gzip 包说:

func (z *Writer) Close() 错误

Close 通过将任何未写入的数据刷新到底层 io.Writer 并写入 GZIP 页脚来关闭 Writer。它不会关闭底层的 io.Writer。

这个文档在说什么冲洗?如果Close 足够了,为什么还需要Flush 功能?为什么Close 不调用Flush

【问题讨论】:

    标签: go


    【解决方案1】:

    关闭确实会导致刷新。当您调用Flush 然后Close 时,流被刷新两次,这会导致输出一个额外的块,它使用5 个字节来编码0 个字节的数据。两个流都编码相同的数据,但其中一个是浪费的。

    至于为什么要使用 Flush,解释就在 Flush 的文档中。有时您还没有完成编写工作,但您需要确保在其他数据可用之前,您已经写入的所有数据都可以被客户端读取。在这些点上,您刷新流。只有在没有更多数据时才会关闭。

    【讨论】:

    • 感谢您的精彩解释。让我困惑的是,有时调用Flush 似乎没有成功刷新,在这个问题中:stackoverflow.com/questions/60923654/…,仅调用Flush 不足以确保所有数据都已写入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2020-05-19
    相关资源
    最近更新 更多