Метод bufio.Writer.Flush
Метод Flush типа bufio.Writer принудительно записывает все данные,
накопленные в буфере, в нижележащий поток вывода. Он не принимает никаких
параметров и возвращает только ошибку, если запись не удалась.
После вызова Flush буфер становится пустым, а все ранее записанные
через методы Write, WriteString и другие данные гарантированно передаются
в целевой писатель. Это особенно важно при работе с сетевыми соединениями
или файлами, где данные могут задерживаться в буфере.
Синтаксис
func (b *Writer) Flush() error
Метод возвращает ошибку error, если во время записи данных
из буфера произошла ошибка. В случае успеха возвращается nil.
Пример
Давайте создадим буферизированный писатель и запишем несколько строк,
а затем принудительно сбросим буфер с помощью Flush:
package 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)
}
}
Результат выполнения кода:
"Hello, World!"
"This is a buffered writer."
Обратите внимание, что без вызова Flush текст не был бы выведен
в консоль, так как он остался бы в буфере.
Пример
Рассмотрим ситуацию, когда после записи данных в буфер мы проверяем
доступное место и затем сбрасываем буфер. Метод Available
возвращает количество байт, которое еще можно записать без сброса:
package 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)
}
}
Результат выполнения кода:
"Available before write: 4096"
"Available after write: 4081"
"Data in buffer"
Как видно из примера, после записи данных доступное место уменьшилось,
а после вызова Flush данные были записаны в стандартный вывод.
Пример
Важно помнить, что после вызова Flush буфер очищается,
и последующие записи начнут заполнять его заново. Покажем это
в следующем примере:
package 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()
}
Результат выполнения кода:
"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,
который возвращает количество байт, ожидающих записи в буфере