Struct std::io::BufWriter 1.0.0[−][src]
pub struct BufWriter<W: Write> { /* fields omitted */ }
Expand description
包装一个 writer 并缓冲其输出。
直接与实现 Write
的组件一起工作可能会非常低效。
例如,对 TcpStream
上 write
的每次调用都会导致系统调用。
BufWriter<W>
保留内存中的数据缓冲区,并以不大批量的方式将其写入基础 writer。
BufWriter<W>
可以提高使 小 和 重复 将调用写入同一文件或网络套接字的程序的速度。
一次写入大量或一次写入几次都无济于事。
当写入内存中的目标 (例如 Vec
<u8>
) 时,它也没有任何优势。
在丢弃 BufWriter<W>
之前,调用 flush
至关重要。
尽管丢弃将尝试刷新缓冲区的内容,但丢弃过程中发生的任何错误都将被忽略。
调用 flush
可确保缓冲区为空,因此丢弃操作甚至不会尝试文件操作。
Examples
让我们将数字 1 到 10 写入 TcpStream
:
use std::io::prelude::*; use std::net::TcpStream; let mut stream = TcpStream::connect("127.0.0.1:34254").unwrap(); for i in 0..10 { stream.write(&[i+1]).unwrap(); }Run
因为我们没有缓冲,所以我们依次写入每个字节,从而导致写入的每个字节占用系统调用的开销。我们可以用
BufWriter<W>
:
use std::io::prelude::*; use std::io::BufWriter; use std::net::TcpStream; let mut stream = BufWriter::new(TcpStream::connect("127.0.0.1:34254").unwrap()); for i in 0..10 { stream.write(&[i+1]).unwrap(); } stream.flush().unwrap();Run
通过用 BufWriter<W>
包装流,这十次写操作全部由缓冲区分组,并且在刷新 stream
时将全部写在一个系统调用中。
Implementations
反汇编此 BufWriter<W>
,返回基础 writer,以及所有缓冲但未写入的数据。
如果基础 writer 恐慌,则不知道写入了数据的哪一部分。
在这种情况下,我们返回 WriterPanicked
作为缓冲数据 (仍然可以从中恢复缓冲内容)。
into_raw_parts
不尝试刷新数据,也不会失败。
Examples
#![feature(bufwriter_into_raw_parts)] use std::io::{BufWriter, Write}; let mut buffer = [0u8; 10]; let mut stream = BufWriter::new(buffer.as_mut()); write!(stream, "too much data").unwrap(); stream.flush().expect_err("it doesn't fit"); let (recovered_writer, buffered_data) = stream.into_raw_parts(); assert_eq!(recovered_writer.len(), 0); assert_eq!(&buffered_data.unwrap(), b"ata");Run
Trait Implementations
将格式化的字符串写入此 writer,返回遇到的任何错误。 Read more