bufio.Writer.Flush în Go

Trimite la destinație toate datele rămase în buffer-ul unui bufio.Writer.

Sintaxă
func (b *Writer) Flush() error

Ce face bufio.Writer.Flush

Flush scrie în Writer-ul de dedesubt tot ce s-a adunat în buffer. Fără el, datele care nu au umplut încă buffer-ul nu ajung niciodată în fișier sau pe ecran.

Returnează prima eroare de scriere. Dacă o scriere anterioară a eșuat, Writer-ul ține minte eroarea și toate apelurile următoare (inclusiv Flush) o returnează; de aceea e suficient să verifici eroarea lui Flush la final.

Ce returnează

nil sau eroarea de scriere.

Exemple

Exemplul 1: Fără Flush și cu Flush

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    f, _ := os.Create("raport.txt")
    w := bufio.NewWriter(f)
    w.WriteString("Vânzări martie: 15 200 lei\n")

    date, _ := os.ReadFile("raport.txt")
    fmt.Printf("înainte de Flush: %q\n", date)

    w.Flush()
    date, _ = os.ReadFile("raport.txt")
    fmt.Printf("după Flush: %q\n", date)
    f.Close()
}

Rezultat

înainte de Flush: ""
după Flush: "Vânzări martie: 15 200 lei\n"

Exemplul 2: Ieșire rapidă pe ecran

Un tipar des întâlnit în concursurile de programare: tot ce afișezi trece prin buffer, iar defer out.Flush() golește la final.

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    out := bufio.NewWriter(os.Stdout)
    defer out.Flush()

    for i := 1; i <= 5; i++ {
        fmt.Fprintf(out, "%d x 7 = %d\n", i, i*7)
    }
}

Rezultat

1 x 7 = 7
2 x 7 = 14
3 x 7 = 21
4 x 7 = 28
5 x 7 = 35

Exemplul 3: Eroarea ajunge la Flush

Fișierul este deschis doar pentru citire, așa că scrierea reală (la Flush) eșuează.

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    os.WriteFile("doar-citire.txt", nil, 0o644)
    f, _ := os.Open("doar-citire.txt")
    defer f.Close()

    w := bufio.NewWriter(f)
    _, err := w.WriteString("text")
    fmt.Println("WriteString:", err) // încă e doar în buffer
    fmt.Println("Flush:", w.Flush())
}

Rezultat

WriteString: <nil>
Flush: write doar-citire.txt: bad file descriptor

Greșeli frecvente

  • Verifici doar erorile lui WriteString. Scrierea reală se face adesea abia la Flush; verifică și eroarea lui.
  • Pui defer w.Flush() și ieși cu os.Exit sau log.Fatal. Defer-ul nu rulează.

Comenzi înrudite

  • bufio.NewWriter: Învelește un io.Writer într-un bufio.Writer, care strânge scrierile mici într-un buffer și le trimite în blocuri.
  • os.File.Sync: Forțează scrierea pe disc a datelor din fișier, ca să nu se piardă la o pană de curent.
  • bufio.Writer.WriteString: WriteString adaugă un text în buffer; WriteRune adaugă un singur caracter Unicode, codat UTF-8.