Метод bufio.Reader.Buffered

Метод bufio.Reader.Buffered возвращает количество байт, которые в данный момент находятся во внутреннем буфере читателя и готовы к чтению без обращения к нижележащему источнику данных. Этот метод не требует передачи параметров и возвращает значение типа int, равное количеству байт в буфере.

Синтаксис

goreader.Buffered()

Метод возвращает количество непрочитанных байт в буфере. Если в буфере нет данных, возвращается 0.

Пример

Создадим буферизированный читатель из строки и прочитаем из нее несколько байт, после чего проверим, сколько байт осталось в буфере:

gopackage main

import (
  "bufio"
  "fmt"
  "strings"
)

func main() {
  str := "Hello, World!"
  reader := bufio.NewReader(strings.NewReader(str))

  b := make([]byte, 5)
  reader.Read(b)

  buffered := reader.Buffered()
  fmt.Println(buffered)
}

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

go8

В исходной строке "Hello, World!" содержится 13 байт. После чтения 5 байт (символы "Hello") в буфере осталось 8 байт, что и было возвращено методом.

Пример

Рассмотрим ситуацию, когда буфер пуст. Если мы прочитаем все данные из буфера, то метод вернет 0:

gopackage main

import (
  "bufio"
  "fmt"
  "strings"
)

func main() {
  str := "abcde"
  reader := bufio.NewReader(strings.NewReader(str))

  buffered := reader.Buffered()
  fmt.Println(buffered)

  b := make([]byte, 10)
  reader.Read(b)

  bufferedAfter := reader.Buffered()
  fmt.Println(bufferedAfter)
}

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

go5
0

Изначально в буфере находится вся строка "abcde" длиной 5 байт. После чтения всех данных буфер становится пустым, и метод возвращает 0.

Пример

Метод Buffered может быть полезен при работе с буферизированным чтением для контроля состояния буфера, например, для проверки наличия данных перед чтением:

gopackage main

import (
  "bufio"
  "fmt"
  "strings"
)

func main() {
  str := "12345"
  reader := bufio.NewReader(strings.NewReader(str))

  for reader.Buffered() > 0 {
    b := make([]byte, 2)
    n, _ := reader.Read(b)
    fmt.Printf("Прочитано %d байт: %s\n", n, b[:n])
    fmt.Printf("Осталось в буфере: %d\n", reader.Buffered())
  }
}

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

go"Прочитано 2 байт: 12"
"Осталось в буфере: 3"
"Прочитано 2 байт: 34"
"Осталось в буфере: 1"
"Прочитано 1 байт: 5"
"Осталось в буфере: 0"

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

  • метод bufio.Reader.Peek,
    который позволяет просмотреть данные в буфере без их чтения
  • метод bufio.Reader.Discard,
    который позволяет пропустить указанное количество байт из буфера
  • метод bufio.Reader.ReadString,
    который читает данные до разделителя
  • метод bufio.Writer.Available,
    который возвращает количество свободного места в буфере записи