如果“关闭”足够,为什么你需要`Flush`?

时间:2018-03-08 05:57:10

标签: go

这就是我使用gzip writer的方式。

    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正在给出不同的结果。

compress/gzip包的

Docs说:

  

func(z * Writer)关闭()错误

     

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

这位医生谈论的是什么?如果Flush足够,为什么你需要Close功能呢?为什么Close不致电Flush

1 个答案:

答案 0 :(得分:7)

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

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

相关问题