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ă cuprocess::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().