pub struct BufWriter<W>where
W: Write,{ /* private fields */ }
Expand description
Wraps a writer and buffers its output.
It can be excessively inefficient to work directly with something that
implements Write
. A BufWriter<W>
keeps an in-memory buffer of data and
writes it to an underlying writer in large, infrequent batches.
BufWriter<W>
can improve the speed of programs that make small and
repeated write calls to the same Write
instance. 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>
.
It is critical to call flush
before BufWriter<W>
is dropped. Though
dropping will attempt to flush the contents of the buffer, any errors
that happen in the process of dropping will be ignored. Calling flush
ensures that the buffer is empty and thus dropping will not even attempt
file operations.
Implementations§
source§impl<W> BufWriter<W>where
W: Write,
impl<W> BufWriter<W>where W: Write,
sourcepub fn new(inner: W) -> BufWriter<W>
pub fn new(inner: W) -> BufWriter<W>
Creates a new BufWriter<W>
with a default buffer capacity. The default is currently 8 KB,
but may change in the future.
Examples
use acid_io::{BufWriter, Cursor};
let buf: Vec<u8> = Vec::new();
let mut writer = BufWriter::new(Cursor::new(buf));
sourcepub fn with_capacity(capacity: usize, inner: W) -> BufWriter<W>
pub fn with_capacity(capacity: usize, inner: W) -> BufWriter<W>
Creates a new BufWriter<W>
with the specified buffer capacity.
Examples
Creating a writer with a buffer of a hundred bytes.
use acid_io::{BufWriter, Cursor};
let buf: Vec<u8> = Vec::new();
let mut writer = BufWriter::with_capacity(100, Cursor::new(buf));
sourcepub fn write_to_buf(&mut self, buf: &[u8]) -> usize
pub fn write_to_buf(&mut self, buf: &[u8]) -> usize
Buffer some data without flushing it, regardless of the size of the data. Writes as much as possible without exceeding capacity. Returns the number of bytes written.
sourcepub fn get_ref(&self) -> &W
pub fn get_ref(&self) -> &W
Gets a reference to the underlying writer.
Examples
use acid_io::BufWriter;
let mut buffer = BufWriter::new(Vec::new());
// we can use reference just like buffer
let reference: &Vec<u8> = buffer.get_ref();
sourcepub fn get_mut(&mut self) -> &mut W
pub fn get_mut(&mut self) -> &mut W
Gets a mutable reference to the underlying writer.
It is inadvisable to directly write to the underlying writer.
Examples
use acid_io::BufWriter;
let mut buffer = BufWriter::new(Vec::new());
// we can use reference just like buffer
let reference: &mut Vec<u8> = buffer.get_mut();
sourcepub fn buffer(&self) -> &[u8]
pub fn buffer(&self) -> &[u8]
Returns a reference to the internally buffered data.
Examples
use acid_io::BufWriter;
let buf_writer = BufWriter::new(Vec::new());
// See how many bytes are currently buffered
let bytes_buffered = buf_writer.buffer().len();
sourcepub fn capacity(&self) -> usize
pub fn capacity(&self) -> usize
Returns the number of bytes the internal buffer can hold without flushing.
Examples
use acid_io::BufWriter;
let buf_writer = BufWriter::new(Vec::new());
// Check the capacity of the inner buffer
let capacity = buf_writer.capacity();
// Calculate how many bytes can be written without flushing
let without_flush = capacity - buf_writer.buffer().len();
sourcepub fn into_inner(self) -> Result<W, IntoInnerError<BufWriter<W>>>
pub fn into_inner(self) -> Result<W, IntoInnerError<BufWriter<W>>>
Unwraps this BufWriter<W>
, returning the underlying writer.
The buffer is written out before returning the writer.
Errors
An [Err
] will be returned if an error occurs while flushing the buffer.
Examples
use acid_io::BufWriter;
let mut buffer = BufWriter::new(Vec::new());
let inner: Vec<u8> = buffer.into_inner().unwrap();
sourcepub fn into_parts(self) -> (W, Result<Vec<u8, Global>, WriterPanicked>)
pub fn into_parts(self) -> (W, Result<Vec<u8, Global>, WriterPanicked>)
Disassembles this BufWriter<W>
, returning the underlying writer, and any buffered but
unwritten data.
If the underlying writer panicked, it is not known what portion of the data was written.
In this case, we return WriterPanicked
for the buffered data (from which the buffer
contents can still be recovered).
into_parts
makes no attempt to flush data and cannot fail.
Examples
use acid_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");
Trait Implementations§
source§impl<W> Seek for BufWriter<W>where
W: Write + Seek,
impl<W> Seek for BufWriter<W>where W: Write + Seek,
source§fn seek(&mut self, pos: SeekFrom) -> Result<u64, Error>
fn seek(&mut self, pos: SeekFrom) -> Result<u64, Error>
Seek to the offset, in bytes, in the underlying writer.
Seeking always writes out the internal buffer before seeking.