Трейт BufRead
Трейт BufRead расширяет трейт Read и предоставляет
дополнительные методы для эффективного чтения данных с буферизацией.
Он позволяет читать данные построчно, получать доступ к внутреннему
буферу и создавать итераторы по строкам. Основные реализации этого
трейта - BufReader и StdinLock.
Синтаксис
use std::io::BufRead;
// Методы трейта
reader.read_line(&mut buf)?;
reader.lines();
reader.fill_buf()?;
reader.consume(amt);
reader.read_until(byte, &mut buf)?;
reader.split(byte);
reader.skip_until(byte)?;
Пример
Давайте прочитаем строки из буферизованного источника
с помощью метода lines:
use std::io::{BufRead, BufReader};
use std::io::Cursor;
fn main()
{
let data = "abcde\n12345\nhello";
let reader = BufReader::new(Cursor::new(data));
for line in reader.lines() {
let line = line.unwrap();
println!("{}", line);
}
}
Результат выполнения кода:
"abcde"
"12345"
"hello"
Пример
Давайте прочитаем одну строку с помощью метода read_line:
use std::io::{BufRead, BufReader};
use std::io::Cursor;
fn main()
{
let data = "abcde\n12345";
let mut reader = BufReader::new(Cursor::new(data));
let mut buf = String::new();
reader.read_line(&mut buf).unwrap();
println!("{}", buf.trim());
}
Результат выполнения кода:
"abcde"
Пример
Давайте получим доступ к внутреннему буферу
с помощью метода fill_buf:
use std::io::{BufRead, BufReader};
use std::io::Cursor;
fn main()
{
let data = "abcde";
let mut reader = BufReader::new(Cursor::new(data));
let buf = reader.fill_buf().unwrap();
println!("{:?}", std::str::from_utf8(buf).unwrap());
let len = buf.len();
reader.consume(len);
}
Результат выполнения кода:
"abcde"