Метод bufio.Writer.Flush

Метод Flush типа bufio.Writer принудительно записывает все данные, накопленные в буфере, в нижележащий поток вывода. Он не принимает никаких параметров и возвращает только ошибку, если запись не удалась. После вызова Flush буфер становится пустым, а все ранее записанные через методы Write, WriteString и другие данные гарантированно передаются в целевой писатель. Это особенно важно при работе с сетевыми соединениями или файлами, где данные могут задерживаться в буфере.

Синтаксис

gofunc (b *Writer) Flush() error

Метод возвращает ошибку error, если во время записи данных из буфера произошла ошибка. В случае успеха возвращается nil.

Пример

Давайте создадим буферизированный писатель и запишем несколько строк, а затем принудительно сбросим буфер с помощью Flush:

gopackage main

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

func main() {
  writer := bufio.NewWriter(os.Stdout)
  writer.WriteString("Hello, ")
  writer.WriteString("World!\n")
  writer.WriteString("This is a buffered writer.\n")

  err := writer.Flush()
  if err != nil {
    fmt.Println("Error flushing:", err)
  }
}

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

go"Hello, World!"
"This is a buffered writer."

Обратите внимание, что без вызова Flush текст не был бы выведен в консоль, так как он остался бы в буфере.

Пример

Рассмотрим ситуацию, когда после записи данных в буфер мы проверяем доступное место и затем сбрасываем буфер. Метод Available возвращает количество байт, которое еще можно записать без сброса:

gopackage main

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

func main() {
  writer := bufio.NewWriter(os.Stdout)

  fmt.Println("Available before write:", writer.Available())

  writer.WriteString("Data in buffer")

  fmt.Println("Available after write:", writer.Available())

  err := writer.Flush()
  if err != nil {
    fmt.Println("Error flushing:", err)
  }
}

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

go"Available before write: 4096"
"Available after write: 4081"
"Data in buffer"

Как видно из примера, после записи данных доступное место уменьшилось, а после вызова Flush данные были записаны в стандартный вывод.

Пример

Важно помнить, что после вызова Flush буфер очищается, и последующие записи начнут заполнять его заново. Покажем это в следующем примере:

gopackage main

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

func main() {
  writer := bufio.NewWriter(os.Stdout)

  writer.WriteString("First part ")
  fmt.Println("Buffer size before flush:", writer.Buffered())

  err := writer.Flush()
  if err != nil {
    fmt.Println("Error flushing:", err)
  }

  writer.WriteString("Second part ")
  fmt.Println("Buffer size after flush and new write:", writer.Buffered())

  writer.Flush()
}

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

go"Buffer size before flush: 11"
"First part Buffer size after flush and new write: 11"
"Second part "

Здесь мы видим, что после первого сброса буфер очистился, а затем в него снова были записаны данные.

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

  • метод bufio.Writer.WriteString,
    который записывает строку в буфер
  • метод bufio.Writer.Write,
    который записывает байтовый срез в буфер
  • метод bufio.Writer.Available,
    который возвращает количество доступных байт в буфере
  • метод bufio.Writer.Buffered,
    который возвращает количество байт, ожидающих записи в буфере