io::BufWriter în Rust

Adaugă un buffer peste orice scriitor: strânge scrierile mici și le trimite în bucăți mari, mult mai rapid.

Sintaxă
use std::io::BufWriter;

fn new(inner: W) -> BufWriter<W>   // W: Write

Ce face io::BufWriter

Fiecare write direct pe un File este un apel către sistemul de operare. BufWriter::new(f) strânge datele în memorie (8 KB implicit) și le scrie în fișier doar când bufferul se umple, la flush() sau când BufWriter-ul dispare.

Important: la distrugere, BufWriter încearcă să scrie ce a rămas, dar ignoră erorile. Ca să afli dacă scrierea a reușit, apelează explicit flush()? la final. into_inner() face flush și îți dă înapoi scriitorul din interior.

Parametri

Parametru Descriere
inner Scriitorul împachetat: File, Stdout, TcpStream etc.

Ce returnează

Un BufWriter<W>.

Exemple

Exemplul 1: Scrierea a multe linii într-un fișier

use std::fs::{self, File};
use std::io::{self, BufWriter, Write};

fn main() -> io::Result<()> {
    let mut w = BufWriter::new(File::create("patrate.txt")?);
    for n in 1..=1000 {
        writeln!(w, "{n} {}", n * n)?;
    }
    w.flush()?;

    let text = fs::read_to_string("patrate.txt")?;
    println!("{} linii, ultima: {}", text.lines().count(), text.lines().last().unwrap_or(""));
    Ok(())
}

Rezultat

1000 linii, ultima: 1000 1000000

Exemplul 2: Datele stau în buffer până la flush

Înainte de flush, fișierul este încă gol pe disc.

use std::fs::{self, File};
use std::io::{self, BufWriter, Write};

fn main() -> io::Result<()> {
    let mut w = BufWriter::new(File::create("mesaj.txt")?);
    write!(w, "Salut din Iași")?;
    println!("înainte de flush: {} octeți în fișier", fs::metadata("mesaj.txt")?.len());

    w.flush()?;
    println!("după flush: {} octeți în fișier", fs::metadata("mesaj.txt")?.len());
    Ok(())
}

Rezultat

înainte de flush: 0 octeți în fișier
după flush: 15 octeți în fișier

Greșeli frecvente

  • Nu apelezi flush() și programul se termină cu process::exit: destructorul nu rulează, iar datele din buffer se pierd.
  • Citești fișierul în timp ce încă scrii prin BufWriter: datele din buffer nu au ajuns încă în el.

Comenzi înrudite

  • io::Write: Trait-ul oricărei destinații de octeți: write_all scrie tot bufferul, flush golește memoria tampon; permite write!.
  • File: Un fișier deschis: File::open îl deschide pentru citire, File::create îl creează (sau golește) pentru scriere.
  • File::sync_all: Forțează scrierea datelor și a metadatelor fișierului pe disc, nu doar în memoria tampon a sistemului.
  • io::stdout: Ieșirea standard ca obiect Write: permite flush(), write! și scriere rapidă prin lock().