Метод bufio.Reader.Read

Метод bufio.Reader.Read считывает данные из буферизованного ридера и помещает их в переданный байтовый слайс. В первый параметр метод принимает байтовый слайс []byte, в который будут записаны прочитанные данные. Метод возвращает количество прочитанных байт int и ошибку error. При достижении конца данных возвращается ошибка io.EOF.

Синтаксис

gon, err := r.Read(p []byte)

Пример

Давайте создадим буферизованный ридер и прочитаем из него строку с помощью метода Read:

gopackage main

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

func main() {
  s := "abcde"
  r := bufio.NewReader(strings.NewReader(s))
  buf := make([]byte, 3)
  n, err := r.Read(buf)

  fmt.Printf("Read %d bytes: %q\n", n, buf[:n])
  if err != nil {
    fmt.Printf("Error: %v\n", err)
  }
}

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

goRead 3 bytes: "abc"

Пример

Прочитаем данные из ридера в несколько вызовов метода Read, пока не достигнем конца данных:

gopackage main

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

func main() {
  s := "12345"
  r := bufio.NewReader(strings.NewReader(s))
  buf := make([]byte, 2)

  for {
    n, err := r.Read(buf)
    if err != nil {
      if err == io.EOF {
        fmt.Println("End of data reached")
        break
      }
      fmt.Printf("Error: %v\n", err)
      break
    }
    fmt.Printf("Read %d bytes: %q\n", n, buf[:n])
  }
}

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

goRead 2 bytes: "12"
Read 2 bytes: "34"
Read 1 bytes: "5"
End of data reached

Пример

Пример чтения данных из файла с использованием метода Read:

gopackage main

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

func main() {
  file, err := os.Open("file.txt")
  if err != nil {
    fmt.Printf("Error opening file: %v\n", err)
    return
  }
  defer file.Close()

  r := bufio.NewReader(file)
  buf := make([]byte, 10)

  for {
    n, err := r.Read(buf)
    if n > 0 {
      fmt.Print(string(buf[:n]))
    }
    if err != nil {
      break
    }
  }
}

В этом примере мы открываем файл, создаем буферизованный ридер и читаем данные порциями по 10 байт до тех пор, пока не встретим ошибку (обычно это io.EOF).

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

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