BufWriter in async_std::io - Rust (original) (raw)
pub struct BufWriter<W> { /* private fields */ }
Expand description
Wraps a writer and buffers its output.
It can be excessively inefficient to work directly with something that implements Write. For example, every call towrite on TcpStream results in a system call. ABufWriter
keeps an in-memory buffer of data and writes it to an underlying writer in large, infrequent batches.
BufWriter
can improve the speed of programs that make small and_repeated_ write calls to the same file or network socket. It does not help when writing very large amounts at once, or writing just one or a few times. It also provides no advantage when writing to a destination that is in memory, like a Vec<u8>
.
Unlike the BufWriter
type in std
, this type does not write out the contents of its buffer when it is dropped. Therefore, it is absolutely critical that users explicitly flush the buffer before dropping aBufWriter
.
This type is an async version of std::io::BufWriter.
§Examples
Let’s write the numbers one through ten to a TcpStream:
use async_std:🥅:TcpStream;
use async_std::prelude::*;
let mut stream = TcpStream::connect("127.0.0.1:34254").await?;
for i in 0..10 {
let arr = [i+1];
stream.write(&arr).await?;
}
Because we’re not buffering, we write each one in turn, incurring the overhead of a system call per byte written. We can fix this with aBufWriter
:
use async_std::io::BufWriter;
use async_std:🥅:TcpStream;
use async_std::prelude::*;
let mut stream = BufWriter::new(TcpStream::connect("127.0.0.1:34254").await?);
for i in 0..10 {
let arr = [i+1];
stream.write(&arr).await?;
};
stream.flush().await?;
By wrapping the stream with a BufWriter
, these ten writes are all grouped together by the buffer, and will all be written out in one system call whenstream.flush()
completes. (As mentioned above, dropping a BufWriter
does not flush its buffers, so a flush
call is essential.)
Creates a new BufWriter
with a default buffer capacity. The default is currently 8 KB, but may change in the future.
§Examples
use async_std::io::BufWriter;
use async_std:🥅:TcpStream;
let mut buffer = BufWriter::new(TcpStream::connect("127.0.0.1:34254").await?);
Creates a new BufWriter
with the specified buffer capacity.
§Examples
Creating a buffer with a buffer of a hundred bytes.
use async_std::io::BufWriter;
use async_std:🥅:TcpStream;
let stream = TcpStream::connect("127.0.0.1:34254").await?;
let mut buffer = BufWriter::with_capacity(100, stream);
Gets a reference to the underlying writer.
§Examples
use async_std::io::BufWriter;
use async_std:🥅:TcpStream;
let mut buffer = BufWriter::new(TcpStream::connect("127.0.0.1:34254").await?);
// We can use reference just like buffer
let reference = buffer.get_ref();
Gets a mutable reference to the underlying writer.
It is inadvisable to directly write to the underlying writer.
§Examples
use async_std::io::BufWriter;
use async_std:🥅:TcpStream;
let mut buffer = BufWriter::new(TcpStream::connect("127.0.0.1:34254").await?);
// We can use reference just like buffer
let reference = buffer.get_mut();
Consumes BufWriter, returning the underlying writer
This method will not write leftover data, it will be lost. For method that will attempt to write before returning the writer see poll_into_inner
§Examples
use async_std::io::BufWriter;
use async_std:🥅:TcpStream;
let buf_writer = BufWriter::new(TcpStream::connect("127.0.0.1:34251").await?);
// unwrap the TcpStream and flush the buffer
let stream = buf_writer.into_inner().await.unwrap();
Returns a reference to the internally buffered data.
§Examples
use async_std::io::BufWriter;
use async_std:🥅:TcpStream;
let buf_writer = BufWriter::new(TcpStream::connect("127.0.0.1:34251").await?);
// See how many bytes are currently buffered
let bytes_buffered = buf_writer.buffer().len();