Метод fill_buf
Метод fill_buf возвращает ссылку на внутренний буфер
читателя в виде среза байтов &[u8]. Метод не опустошает
буфер и не потребляет данные - прочитанные байты остаются
в буфере до следующего вызова метода consume.
Параметров метод не принимает.
Метод возвращает Result<&[u8], Error>. Если буфер пуст,
возвращается пустой срез &[], что сигнализирует
о достижении конца потока. Метод доступен для всех типов,
реализующих трейт BufRead, например для BufReader
или StdinLock.
Синтаксис
buf_read.fill_buf()
Пример
Давайте прочитаем данные из BufReader с помощью метода
fill_buf и выведем их на экран:
use std::io::BufRead;
use std::io::BufReader;
fn main()
{
let data = "abcde".as_bytes();
let mut reader = BufReader::new(data);
let buf = reader.fill_buf().unwrap();
println!("{:?}", buf);
}
Результат выполнения кода:
[97, 98, 99, 100, 101]
Пример
Давайте прочитаем данные в цикле, используя метод
fill_buf вместе с методом consume для продвижения
по потоку:
use std::io::BufRead;
use std::io::BufReader;
fn main()
{
let data = "12345".as_bytes();
let mut reader = BufReader::new(data);
let mut res = Vec::new();
loop {
let buf = reader.fill_buf().unwrap();
if buf.is_empty() {
break;
}
let len = buf.len();
res.extend_from_slice(buf);
reader.consume(len);
}
println!("{:?}", res);
}
Результат выполнения кода:
[49, 50, 51, 52, 53]
Пример
Давайте проверим, что метод fill_buf не потребляет
данные и при повторном вызове возвращает тот же срез:
use std::io::BufRead;
use std::io::BufReader;
fn main()
{
let data = "abcde".as_bytes();
let mut reader = BufReader::new(data);
let buf1 = reader.fill_buf().unwrap();
let buf2 = reader.fill_buf().unwrap();
println!("{}", buf1 == buf2);
}
Результат выполнения кода:
true