Тип bufio.Writer
Тип bufio.Writer представляет собой буферизированный писатель,
который накапливает данные во внутреннем буфере перед записью
в основной поток вывода. Это позволяет значительно уменьшить
количество системных вызовов при большом количестве мелких операций
записи. Первый параметр конструктора bufio.NewWriter
принимает объект, реализующий интерфейс io.Writer,
например, os.File или сетевой сокет. Второй необязательный
параметр для bufio.NewWriterSize задает размер буфера
в байтах.
Основной метод Write записывает срез байтов в буфер,
метод WriteString записывает строку, а методы
WriteByte и WriteRune записывают отдельные
байты и руны соответственно. Для принудительной записи
всех данных из буфера в основной поток используется метод
Flush.
Создание Writer
Для создания буферизированного писателя используется функция
bufio.NewWriter, которая создает писатель с буфером
по умолчанию размером 4096 байт:
package main
import (
"bufio"
"os"
)
func main() {
file, _ := os.Create("output.txt")
writer := bufio.NewWriter(file)
defer writer.Flush()
}
Запись строки
Метод WriteString записывает строку в буфер
и возвращает количество записанных байтов и ошибку:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, _ := os.Create("output.txt")
writer := bufio.NewWriter(file)
n, err := writer.WriteString("Hello, World!")
if err != nil {
fmt.Println("Error:", err)
}
fmt.Println("Written bytes:", n)
writer.Flush()
}
Результат выполнения кода:
"Written bytes: 13"
Запись байтов
Метод Write записывает срез байтов в буфер.
Давайте запишем слайс байтов в файл:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, _ := os.Create("output.txt")
writer := bufio.NewWriter(file)
data := []byte("12345")
n, err := writer.Write(data)
if err != nil {
fmt.Println("Error:", err)
}
fmt.Println("Written bytes:", n)
writer.Flush()
}
Результат выполнения кода:
"Written bytes: 5"
Принудительная запись
Метод Flush принудительно записывает все данные
из буфера в основной поток. Без вызова Flush
данные могут остаться в буфере при завершении программы:
package main
import (
"bufio"
"os"
)
func main() {
file, _ := os.Create("output.txt")
writer := bufio.NewWriter(file)
writer.WriteString("Important data")
writer.Flush() // Принудительная запись в файл
}
Проверка доступного места
Метод Available возвращает количество байтов,
которые можно записать в буфер без его переполнения:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, _ := os.Create("output.txt")
writer := bufio.NewWriter(file)
available := writer.Available()
fmt.Println("Available bytes:", available)
writer.WriteString("12345")
available = writer.Available()
fmt.Println("Available after write:", available)
writer.Flush()
}
Результат выполнения кода:
"Available bytes: 4096"
"Available after write: 4091"
Запись отдельных символов
Метод WriteRune записывает руну (Unicode-символ)
в буфер и возвращает количество записанных байтов:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, _ := os.Create("output.txt")
writer := bufio.NewWriter(file)
n, err := writer.WriteRune('☺')
if err != nil {
fmt.Println("Error:", err)
}
fmt.Println("Written bytes:", n)
writer.Flush()
}
Результат выполнения кода:
"Written bytes: 3"
Запись и немедленный сброс
Важно всегда вызывать Flush после завершения
операций записи, чтобы гарантировать, что все данные
будут записаны в основной поток:
package main
import (
"bufio"
"os"
)
func main() {
file, _ := os.Create("output.txt")
writer := bufio.NewWriter(file)
writer.WriteString("First line\n")
writer.WriteString("Second line\n")
writer.Flush() // Все данные записаны в файл
}
Смотрите также
-
функцию
bufio.NewWriter,
которая создает буферизированный писатель -
тип
bufio.Reader,
который предоставляет буферизированное чтение данных -
метод
bufio.Writer.WriteString,
который записывает строку в буфер -
метод
bufio.Writer.Flush,
который сбрасывает все данные из буфера