Чтение определенного количества байтов из буферизованного считывателя в golang

Я знаю о конкретной функции в golang из bufio.

func (b *Reader) Peek(n int) ([]byte, error)

Peek возвращает следующие n байт без продвижения читателя. Байт прекратите быть действительным при следующем вызове чтения. Если Peek возвращает меньше n байт, он также возвращает ошибку, объясняющую, почему чтение короткое. Этот ошибка ErrBufferFull, если n больше размера буфера B.

Мне нужно уметь читать определенное число байтов от читателя, что продвинет читателя. В принципе, идентична функции выше, но она продвигает читателя. Кто-нибудь знает, как это сделать?

5 ответов


func (b *Reader) Read(p []byte) (n int, err error)

http://golang.org/pkg/bufio/#Reader.Read

количество прочитанных байтов будет ограничено len(p)


отметим, что bufio.Read метод вызывает базовый io.Read не более одного раза, что означает, что он может вернуться n < len(p), не достигая EOF. Если вы хотите прочитать именно len(p) байт или ошибка с ошибкой, вы можете использовать io.ReadFull такой:

n, err := io.ReadFull(reader, p)

это работает, даже если читатель буферизуется.


передайте считывателю буфер размером n байт.


Я предпочитаю читать (), особенно если вы собираетесь читать файлы любого типа, и это может быть также полезно при отправке данных в кусках, ниже приведен пример, чтобы показать, как он используется

fs, err := os.Open("fileName"); 

if err != nil{
    fmt.Println("error reading file")
    return
}

defer fs.Close()

reader := bufio.NewReader(fs)

buf := make([]byte, 1024)

for{
    v, _ := reader.Read(buf) //ReadString and ReadLine() also applicable or alternative

    if v == 0{
        return
    }
    //in case it is a string file, you could check its content here...
    fmt.Print(string(buf))
}

для этого вам просто нужно создать байтовый срез и читать данные в этот кусочек с

n := 512
buff := make([]byte, n)
fs.Read(buff)  // fs is your reader. Can be like this fs, _ := os.Open('file')

func (b *Reader) Read(p []byte) (n int, err error)

Read считывает данные в p. Он возвращает количество байтов, прочитанных в p. Байты берутся не более чем из одного чтения на базовом считывателе, следовательно, n может быть меньше len (p)