Класс BufWriter
Класс BufWriter оборачивает любой тип, реализующий трейт Write,
и добавляет буферизацию. Вместо того чтобы выполнять запись при каждом
вызове метода write, данные накапливаются во внутреннем буфере
и сбрасываются на диск или в поток только при заполнении буфера
или явном вызове метода flush. Параметром конструктор принимает
объект, реализующий трейт Write, который будет использоваться
для фактической записи.
Синтаксис
use std::io::BufWriter;
use std::io::Write;
let mut writer = BufWriter::new(inner);
Пример
Давайте создадим буферизованный писатель для стандартного вывода и запишем в него несколько строк:
use std::io::BufWriter;
use std::io::Write;
fn main()
{
let stdout = std::io::stdout();
let mut writer = BufWriter::new(stdout);
writer.write_all(b"abcde\n").unwrap();
writer.write_all(b"12345\n").unwrap();
writer.flush().unwrap();
}
Результат выполнения кода:
"abcde"
"12345"
Пример
Давайте сравним производительность записи в файл с буферизацией и без неё. Сначала запишем данные напрямую:
use std::fs::File;
use std::io::Write;
fn main()
{
let mut file = File::create("test.txt").unwrap();
for i in 0..1000
{
file.write_all(b"abcde\n").unwrap();
}
}
Теперь используем BufWriter для уменьшения количества
системных вызовов:
use std::fs::File;
use std::io::BufWriter;
use std::io::Write;
fn main()
{
let file = File::create("test.txt").unwrap();
let mut writer = BufWriter::new(file);
for i in 0..1000
{
writer.write_all(b"abcde\n").unwrap();
}
writer.flush().unwrap();
}
Оба примера создают одинаковый файл, но второй вариант работает значительно быстрее благодаря буферизации.
Пример
Давайте запишем форматированные данные в буферизованный поток:
use std::io::BufWriter;
use std::io::Write;
fn main()
{
let stdout = std::io::stdout();
let mut writer = BufWriter::new(stdout);
writeln!(writer, "{}", 12345).unwrap();
writeln!(writer, "{}", "abcde").unwrap();
writer.flush().unwrap();
}
Результат выполнения кода:
"12345"
"abcde"