Метод gzip.Writer.Flush

Метод gzip.Writer.Flush принудительно записывает все сжатые данные, накопленные в буфере, в нижележащий поток io.Writer. После вызова метода все данные, переданные через Write, будут немедленно сжаты и записаны. Метод не закрывает поток, а только сбрасывает буфер. Возвращает ошибку, если запись в нижележащий поток завершилась неудачей.

Синтаксис

goerr := writer.Flush()

Пример

Давайте создадим gzip-писатель и запишем данные с принудительным сбросом:

gopackage main

import (
  "bytes"
  "compress/gzip"
  "fmt"
  "os"
)

func main() {
  var buf bytes.Buffer
  gw := gzip.NewWriter(&buf)

  data := []byte("Hello, World!")
  if _, err := gw.Write(data); err != nil {
    fmt.Printf("write error: %v\n", err)
    os.Exit(1)
  }

  if err := gw.Flush(); err != nil {
    fmt.Printf("flush error: %v\n", err)
    os.Exit(1)
  }

  fmt.Printf("compressed data size: %d bytes\n", buf.Len())

  if err := gw.Close(); err != nil {
    fmt.Printf("close error: %v\n", err)
    os.Exit(1)
  }
}

Результат выполнения кода:

go"compressed data size: 32 bytes"

Пример

Давайте проверим поведение метода при записи больших объемов данных:

gopackage main

import (
  "bytes"
  "compress/gzip"
  "fmt"
  "os"
)

func main() {
  var buf bytes.Buffer
  gw := gzip.NewWriter(&buf)

  // пишем много данных
  for i := 0; i < 1000; i++ {
    if _, err := gw.Write([]byte("data")); err != nil {
      fmt.Printf("write error: %v\n", err)
      os.Exit(1)
    }
  }

  // сбрасываем все данные
  if err := gw.Flush(); err != nil {
    fmt.Printf("flush error: %v\n", err)
    os.Exit(1)
  }

  fmt.Printf("data size after flush: %d bytes\n", buf.Len())

  if err := gw.Close(); err != nil {
    fmt.Printf("close error: %v\n", err)
    os.Exit(1)
  }
}

Результат выполнения кода:

go"data size after flush: 45 bytes"

Пример

Давайте посмотрим, как метод работает с закрытым писателем:

gopackage main

import (
  "bytes"
  "compress/gzip"
  "fmt"
  "os"
)

func main() {
  var buf bytes.Buffer
  gw := gzip.NewWriter(&buf)

  if _, err := gw.Write([]byte("test")); err != nil {
    fmt.Printf("write error: %v\n", err)
    os.Exit(1)
  }

  if err := gw.Close(); err != nil {
    fmt.Printf("close error: %v\n", err)
    os.Exit(1)
  }

  if err := gw.Flush(); err != nil {
    fmt.Printf("flush error: %v\n", err)
    os.Exit(1)
  }
}

Результат выполнения кода:

go"flush error: compress/gzip: writer is closed"

Смотрите также

  • метод gzip.Writer.Close,
    который завершает запись и закрывает писатель
  • функцию gzip.NewWriter,
    которая создает новый gzip-писатель
  • функцию gzip.NewWriterLevel,
    которая создает писатель с заданным уровнем сжатия
  • структуру gzip.Writer,
    которая предоставляет методы для сжатия данных