pub struct BufWriter<W: Write> { /* private fields */ }
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§
source§impl<W: Write> BufWriter<W>
impl<W: Write> BufWriter<W>
sourcepub fn with_capacity(capacity: usize, inner: W) -> BufWriter<W> ⓘ
pub fn with_capacity(capacity: usize, inner: W) -> BufWriter<W> ⓘ
sourcepub fn into_inner(self) -> Result<W, IntoInnerError<BufWriter<W>>>
pub fn into_inner(self) -> Result<W, IntoInnerError<BufWriter<W>>>
1.56.0 · sourcepub fn into_parts(self) -> (W, Result<Vec<u8>, WriterPanicked>)
pub fn into_parts(self) -> (W, Result<Vec<u8>, WriterPanicked>)
反汇编这个 BufWriter<W>
,返回底层 writer,以及任何缓冲但未写入的数据。
如果底层的 writer 发生 panic,就不知道数据的哪一部分被写入了。
在这种情况下,我们返回 WriterPanicked
作为缓冲数据 (仍然可以从中恢复缓冲内容)。
into_parts
不会尝试刷新数据,并且不会失败。
Examples
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_parts();
assert_eq!(recovered_writer.len(), 0);
assert_eq!(&buffered_data.unwrap(), b"ata");
RunTrait Implementations§
source§impl<W: Write + Seek> Seek for BufWriter<W>
impl<W: Write + Seek> Seek for BufWriter<W>
source§impl<W: Write> Write for BufWriter<W>
impl<W: Write> Write for BufWriter<W>
source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
🔬This is a nightly-only experimental API. (
can_vector
#69941)source§fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
🔬This is a nightly-only experimental API. (
write_all_vectored
#70436)尝试将多个缓冲区写入此 writer。 Read more