3 votes

Pourquoi avez-vous besoin de `Flush` du tout si `Close` suffit?

Voici comment j'utilise le 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)
    }

lien du playground https://play.golang.org/p/oafHItGOlDN

Clair, Flush + Close et juste Close produisent des résultats différents.

Docs pour le package compress/gzip indique:

func (z *Writer) Close() error

Close ferme le Writer en vidant toutes les données non écrites dans io.Writer sous-jacent et en écrivant le pied de page GZIP. Il ne ferme pas le io.Writer sous-jacent.

À quoi sert ce "flushing" dont parle ce doc? Pourquoi avez-vous besoin de la fonction Flush si Close suffit? Pourquoi Close n'appelle-t-il pas Flush?

7voto

hobbs Points 71946

La fermeture entraîne un vidage. Lorsque vous appelez la méthode Flush suivie de la méthode Close, le flux est vidé deux fois, ce qui entraîne la sortie d'un bloc supplémentaire, utilisant 5 octets pour coder 0 octet de données. Les deux flux codent les mêmes données, mais l'un d'eux est gaspilleur.

Quant à la raison d'utiliser Flush, l'explication se trouve dans la documentation de Flush. Parfois, vous n'avez pas encore fini d'écrire, mais vous devez vous assurer que toutes les données que vous avez écrites jusqu'à présent sont lisibles par le client, avant que des données supplémentaires soient disponibles. À ces moments-là, vous videz le flux. Vous ne le fermez que lorsqu'il n'y aura plus de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X