РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
789 of 1245 menu

Класс 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"

Смотрите также

  • класс BufReader,
    который обеспечивает буферизованное чтение данных
  • метод flush,
    который сбрасывает буфер и записывает данные
  • метод write_all,
    который записывает все байты в поток
  • трейт Write,
    который определяет интерфейс для записи данных
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить