pub struct BufWriter<W: Write, P = StdPolicy> { /* private fields */ }
Expand description
A drop-in replacement for std::io::BufWriter
with more functionality.
Original method names/signatures and implemented traits are left untouched, making replacement as simple as swapping the import of the type.
By default this type implements the behavior of its std
counterpart: it only flushes
the buffer if an incoming write is larger than the remaining space.
To change this type’s behavior, change the policy with .set_policy()
using a type
from the policy
module or your own implentation of WriterPolicy
.
Policies that perform alternating writes and flushes without completely emptying the buffer
may benefit from using a ringbuffer via the new_ringbuf()
and with_capacity_ringbuf()
constructors. Ringbuffers are only available on supported platforms with the
slice-deque
feature and have some caveats; see the docs at the crate root
for more details.
Implementations§
Source§impl<W: Write> BufWriter<W>
impl<W: Write> BufWriter<W>
Sourcepub fn new(inner: W) -> Self
pub fn new(inner: W) -> Self
Create a new BufWriter
wrapping inner
with the default buffer capacity and
WriterPolicy
.
Sourcepub fn with_capacity(cap: usize, inner: W) -> Self
pub fn with_capacity(cap: usize, inner: W) -> Self
Create a new BufWriter
wrapping inner
, utilizing a buffer with a capacity
of at least cap
bytes and the default WriterPolicy
.
The actual capacity of the buffer may vary based on implementation details of the global allocator.
Sourcepub fn new_ringbuf(inner: W) -> Self
pub fn new_ringbuf(inner: W) -> Self
Create a new BufWriter
wrapping inner
, utilizing a ringbuffer with the default
capacity and WriterPolicy
.
A ringbuffer never has to move data to make room; consuming bytes from the head
simultaneously makes room at the tail. This is useful in conjunction with a policy like
FlushExact
to ensure there is always room to write more data if
necessary, without expensive copying operations.
Only available on platforms with virtual memory support and with the slice-deque
feature
enabled. The default capacity will differ between Windows and Unix-derivative targets.
See Buffer::new_ringbuf()
or the crate root docs for more info.
Sourcepub fn with_capacity_ringbuf(cap: usize, inner: W) -> Self
pub fn with_capacity_ringbuf(cap: usize, inner: W) -> Self
Create a new BufWriter
wrapping inner
, utilizing a ringbuffer with at least cap
capacity and the default WriterPolicy
.
A ringbuffer never has to move data to make room; consuming bytes from the head
simultaneously makes room at the tail. This is useful in conjunction with a policy like
FlushExact
to ensure there is always room to write more data if
necessary, without expensive copying operations.
Only available on platforms with virtual memory support and with the slice-deque
feature
enabled. The capacity will be rounded up to the minimum size for the target platform.
See Buffer::with_capacity_ringbuf()
or the crate root docs for more info.
Sourcepub fn with_buffer(buf: Buffer, inner: W) -> BufWriter<W> ⓘ
pub fn with_buffer(buf: Buffer, inner: W) -> BufWriter<W> ⓘ
Create a new BufWriter
wrapping inner
, utilizing the existing Buffer
instance and the default WriterPolicy
.
§Note
Does not clear the buffer first! If there is data already in the buffer it will be written out on the next flush!
Source§impl<W: Write, P> BufWriter<W, P>
impl<W: Write, P> BufWriter<W, P>
Sourcepub fn set_policy<P_: WriterPolicy>(self, policy: P_) -> BufWriter<W, P_> ⓘ
pub fn set_policy<P_: WriterPolicy>(self, policy: P_) -> BufWriter<W, P_> ⓘ
Set a new WriterPolicy
, returning the transformed type.
Sourcepub fn policy_mut(&mut self) -> &mut P
pub fn policy_mut(&mut self) -> &mut P
Mutate the current WriterPolicy
.
Sourcepub fn get_mut(&mut self) -> &mut W
pub fn get_mut(&mut self) -> &mut W
Get a mutable reference to the inner writer.
§Note
If the buffer has not been flushed, writing directly to the inner type will cause data inconsistency.
Sourcepub fn reserve(&mut self, additional: usize)
pub fn reserve(&mut self, additional: usize)
Reserve space in the buffer for at least additional
bytes. May not be
quite exact due to implementation details of the buffer’s allocator.
Sourcepub fn make_room(&mut self)
pub fn make_room(&mut self)
Move data to the start of the buffer, making room at the end for more writing.
This is a no-op with the *_ringbuf()
constructors (requires slice-deque
feature).
Sourcepub fn into_inner_with_buffer(self) -> (W, Buffer)
pub fn into_inner_with_buffer(self) -> (W, Buffer)
Consume self
and return both the underlying writer and the buffer
Source§impl<W: Write, P: WriterPolicy> BufWriter<W, P>
impl<W: Write, P: WriterPolicy> BufWriter<W, P>
Sourcepub fn into_inner(self) -> Result<W, IntoInnerError<Self>>
pub fn into_inner(self) -> Result<W, IntoInnerError<Self>>
Flush the buffer and unwrap, returning the inner writer on success,
or a type wrapping self
plus the error otherwise.
Sourcepub fn into_inner_with_err(self) -> (W, Option<Error>)
pub fn into_inner_with_err(self) -> (W, Option<Error>)
Flush the buffer and unwrap, returning the inner writer and any error encountered during flushing.
Trait Implementations§
Source§impl<W: Write, P> Drop for BufWriter<W, P>
Attempt to flush the buffer to the underlying writer.
impl<W: Write, P> Drop for BufWriter<W, P>
Attempt to flush the buffer to the underlying writer.
If an error occurs, the thread-local handler is invoked, if one was previously
set by set_drop_err_handler
for this thread.
Source§impl<W: Write + Seek, P: WriterPolicy> Seek for BufWriter<W, P>
impl<W: Write + Seek, P: WriterPolicy> Seek for BufWriter<W, P>
Source§fn seek(&mut self, pos: SeekFrom) -> Result<u64>
fn seek(&mut self, pos: SeekFrom) -> Result<u64>
Seek to the ofPet, in bytes, in the underlying writer.
Seeking always writes out the internal buffer before seeking.
1.55.0 · Source§fn rewind(&mut self) -> Result<(), Error>
fn rewind(&mut self) -> Result<(), Error>
Source§fn stream_len(&mut self) -> Result<u64, Error>
fn stream_len(&mut self) -> Result<u64, Error>
seek_stream_len
)Source§impl<W: Write, P: WriterPolicy> Write for BufWriter<W, P>
impl<W: Write, P: WriterPolicy> Write for BufWriter<W, P>
Source§fn write(&mut self, buf: &[u8]) -> Result<usize>
fn write(&mut self, buf: &[u8]) -> Result<usize>
Source§fn flush(&mut self) -> Result<()>
fn flush(&mut self) -> Result<()>
Source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
can_vector
)1.0.0 · Source§fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
Source§fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
write_all_vectored
)