Чтение определенного количества байтов из буферизованного считывателя в 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)
это работает, даже если читатель буферизуется.
Я предпочитаю читать (), особенно если вы собираетесь читать файлы любого типа, и это может быть также полезно при отправке данных в кусках, ниже приведен пример, чтобы показать, как он используется
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)