pub struct Cursor<T> { /* private fields */ }Expand description
A Cursor wraps an in-memory buffer and provides it with a
Seek implementation.
Cursors are used with in-memory buffers, anything implementing
AsRef<[u8]>, to allow them to implement Read and/or Write,
allowing these buffers to be used anywhere you might use a reader or writer
that does actual I/O.
The standard library implements some I/O traits on various types which
are commonly used as a buffer, like Cursor<Vec<u8>> and
Cursor<&[u8]>.
Examples
We may want to write bytes to a File in our production
code, but use an in-memory buffer in our tests. We can do this with
Cursor:
use std::io::prelude::*;
use std::io::{self, SeekFrom};
use std::fs::File;
// a library function we've written
fn write_ten_bytes_at_end<W: Write + Seek>(writer: &mut W) -> io::Result<()> {
writer.seek(SeekFrom::End(-10))?;
for i in 0..10 {
writer.write(&[i])?;
}
// all went well
Ok(())
}
// Here's some code that uses this library function.
//
// We might want to use a BufReader here for efficiency, but let's
// keep this example focused.
let mut file = File::create("foo.txt")?;
write_ten_bytes_at_end(&mut file)?;
// now let's write a test
#[test]
fn test_writes_bytes() {
// setting up a real File is much slower than an in-memory buffer,
// let's use a cursor instead
use std::io::Cursor;
let mut buff = Cursor::new(vec![0; 15]);
write_ten_bytes_at_end(&mut buff).unwrap();
assert_eq!(&buff.get_ref()[5..15], &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
}RunImplementations
impl<T> Cursor<T>
source
impl<T> Cursor<T>
sourcepub fn new(inner: T) -> Cursor<T>ⓘNotable traits for Cursor<T>impl<T> Read for Cursor<T> where
T: AsRef<[u8]>, impl Write for Cursor<&mut [u8]>impl<A> Write for Cursor<&mut Vec<u8, A>> where
A: Allocator, impl<A> Write for Cursor<Vec<u8, A>> where
A: Allocator, impl<A> Write for Cursor<Box<[u8], A>> where
A: Allocator, impl<const N: usize> Write for Cursor<[u8; N]>
const: unstable · source
pub fn new(inner: T) -> Cursor<T>ⓘNotable traits for Cursor<T>impl<T> Read for Cursor<T> where
T: AsRef<[u8]>, impl Write for Cursor<&mut [u8]>impl<A> Write for Cursor<&mut Vec<u8, A>> where
A: Allocator, impl<A> Write for Cursor<Vec<u8, A>> where
A: Allocator, impl<A> Write for Cursor<Box<[u8], A>> where
A: Allocator, impl<const N: usize> Write for Cursor<[u8; N]>
const: unstable · sourceT: AsRef<[u8]>, impl Write for Cursor<&mut [u8]>impl<A> Write for Cursor<&mut Vec<u8, A>> where
A: Allocator, impl<A> Write for Cursor<Vec<u8, A>> where
A: Allocator, impl<A> Write for Cursor<Box<[u8], A>> where
A: Allocator, impl<const N: usize> Write for Cursor<[u8; N]>
Creates a new cursor wrapping the provided underlying in-memory buffer.
Cursor initial position is 0 even if underlying buffer (e.g., Vec)
is not empty. So writing to cursor starts with overwriting Vec
content, not with appending to it.
Examples
use std::io::Cursor;
let buff = Cursor::new(Vec::new());Runpub fn into_inner(self) -> T
source
pub fn into_inner(self) -> T
sourcepub fn position(&self) -> u64
const: unstable · source
pub fn position(&self) -> u64
const: unstable · sourceReturns the current position of this cursor.
Examples
use std::io::Cursor;
use std::io::prelude::*;
use std::io::SeekFrom;
let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);
assert_eq!(buff.position(), 0);
buff.seek(SeekFrom::Current(2)).unwrap();
assert_eq!(buff.position(), 2);
buff.seek(SeekFrom::Current(-1)).unwrap();
assert_eq!(buff.position(), 1);Runpub fn set_position(&mut self, pos: u64)
source
pub fn set_position(&mut self, pos: u64)
sourceimpl<T> Cursor<T> where
T: AsRef<[u8]>,
source
impl<T> Cursor<T> where
T: AsRef<[u8]>,
sourcepub fn remaining_slice(&self) -> &[u8]ⓘNotable traits for &[u8]impl Read for &[u8]impl Write for &mut [u8]
source
pub fn remaining_slice(&self) -> &[u8]ⓘNotable traits for &[u8]impl Read for &[u8]impl Write for &mut [u8]
sourceReturns the remaining slice.
Examples
#![feature(cursor_remaining)]
use std::io::Cursor;
let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);
assert_eq!(buff.remaining_slice(), &[1, 2, 3, 4, 5]);
buff.set_position(2);
assert_eq!(buff.remaining_slice(), &[3, 4, 5]);
buff.set_position(4);
assert_eq!(buff.remaining_slice(), &[5]);
buff.set_position(6);
assert_eq!(buff.remaining_slice(), &[]);Runpub fn is_empty(&self) -> bool
source
pub fn is_empty(&self) -> bool
sourceReturns true if the remaining slice is empty.
Examples
#![feature(cursor_remaining)]
use std::io::Cursor;
let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);
buff.set_position(2);
assert!(!buff.is_empty());
buff.set_position(5);
assert!(buff.is_empty());
buff.set_position(10);
assert!(buff.is_empty());RunTrait Implementations
impl<T> BufRead for Cursor<T> where
T: AsRef<[u8]>,
source
impl<T> BufRead for Cursor<T> where
T: AsRef<[u8]>,
sourcefn fill_buf(&mut self) -> Result<&[u8]>
source
fn fill_buf(&mut self) -> Result<&[u8]>
sourceReturns the contents of the internal buffer, filling it with more data from the inner reader if it is empty. Read more
fn consume(&mut self, amt: usize)
source
fn consume(&mut self, amt: usize)
sourceTells this buffer that amt bytes have been consumed from the buffer,
so they should no longer be returned in calls to read. Read more
fn has_data_left(&mut self) -> Result<bool>
source
fn has_data_left(&mut self) -> Result<bool>
sourceCheck if the underlying Read has any data left to be read. Read more
fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> Result<usize>
source
fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> Result<usize>
sourceRead all bytes into buf until the delimiter byte or EOF is reached. Read more
fn read_line(&mut self, buf: &mut String) -> Result<usize>
source
fn read_line(&mut self, buf: &mut String) -> Result<usize>
sourceRead all bytes until a newline (the 0xA byte) is reached, and append
them to the provided buffer. You do not need to clear the buffer before
appending. Read more
impl<T: Default> Default for Cursor<T>
source
impl<T: Default> Default for Cursor<T>
sourcefn default() -> Cursor<T>ⓘNotable traits for Cursor<T>impl<T> Read for Cursor<T> where
T: AsRef<[u8]>, impl Write for Cursor<&mut [u8]>impl<A> Write for Cursor<&mut Vec<u8, A>> where
A: Allocator, impl<A> Write for Cursor<Vec<u8, A>> where
A: Allocator, impl<A> Write for Cursor<Box<[u8], A>> where
A: Allocator, impl<const N: usize> Write for Cursor<[u8; N]>
source
fn default() -> Cursor<T>ⓘNotable traits for Cursor<T>impl<T> Read for Cursor<T> where
T: AsRef<[u8]>, impl Write for Cursor<&mut [u8]>impl<A> Write for Cursor<&mut Vec<u8, A>> where
A: Allocator, impl<A> Write for Cursor<Vec<u8, A>> where
A: Allocator, impl<A> Write for Cursor<Box<[u8], A>> where
A: Allocator, impl<const N: usize> Write for Cursor<[u8; N]>
sourceT: AsRef<[u8]>, impl Write for Cursor<&mut [u8]>impl<A> Write for Cursor<&mut Vec<u8, A>> where
A: Allocator, impl<A> Write for Cursor<Vec<u8, A>> where
A: Allocator, impl<A> Write for Cursor<Box<[u8], A>> where
A: Allocator, impl<const N: usize> Write for Cursor<[u8; N]>
Returns the “default value” for a type. Read more
impl<T> Read for Cursor<T> where
T: AsRef<[u8]>,
source
impl<T> Read for Cursor<T> where
T: AsRef<[u8]>,
sourcefn read(&mut self, buf: &mut [u8]) -> Result<usize>
source
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
sourcePull some bytes from this source into the specified buffer, returning how many bytes were read. Read more
fn read_buf(&mut self, buf: &mut ReadBuf<'_>) -> Result<()>
source
fn read_buf(&mut self, buf: &mut ReadBuf<'_>) -> Result<()>
sourcePull some bytes from this source into the specified buffer. Read more
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
source
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
sourceLike read, except that it reads into a slice of buffers. Read more
fn is_read_vectored(&self) -> bool
source
fn is_read_vectored(&self) -> bool
sourceDetermines if this Reader has an efficient read_vectored
implementation. Read more
fn read_exact(&mut self, buf: &mut [u8]) -> Result<()>
source
fn read_exact(&mut self, buf: &mut [u8]) -> Result<()>
sourceRead the exact number of bytes required to fill buf. Read more
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
source
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
sourceRead all bytes until EOF in this source, placing them into buf. Read more
fn read_to_string(&mut self, buf: &mut String) -> Result<usize>
source
fn read_to_string(&mut self, buf: &mut String) -> Result<usize>
sourceRead all bytes until EOF in this source, appending them to buf. Read more
fn read_buf_exact(&mut self, buf: &mut ReadBuf<'_>) -> Result<()>
source
fn read_buf_exact(&mut self, buf: &mut ReadBuf<'_>) -> Result<()>
sourceRead the exact number of bytes required to fill buf. Read more
fn by_ref(&mut self) -> &mut Self where
Self: Sized,
source
fn by_ref(&mut self) -> &mut Self where
Self: Sized,
sourceCreates a “by reference” adaptor for this instance of Read. Read more
fn bytes(self) -> Bytes<Self>ⓘNotable traits for Bytes<R>impl<R: Read> Iterator for Bytes<R> type Item = Result<u8>; where
Self: Sized,
source
fn bytes(self) -> Bytes<Self>ⓘNotable traits for Bytes<R>impl<R: Read> Iterator for Bytes<R> type Item = Result<u8>; where
Self: Sized,
sourceimpl<T> Seek for Cursor<T> where
T: AsRef<[u8]>,
source
impl<T> Seek for Cursor<T> where
T: AsRef<[u8]>,
sourcefn seek(&mut self, style: SeekFrom) -> Result<u64>
source
fn seek(&mut self, style: SeekFrom) -> Result<u64>
sourceSeek to an offset, in bytes, in a stream. Read more
fn stream_len(&mut self) -> Result<u64>
source
fn stream_len(&mut self) -> Result<u64>
sourceReturns the length of this stream (in bytes). Read more
fn stream_position(&mut self) -> Result<u64>
source
fn stream_position(&mut self) -> Result<u64>
sourceReturns the current seek position from the start of the stream. Read more
impl Write for Cursor<&mut [u8]>
source
impl Write for Cursor<&mut [u8]>
sourcefn write(&mut self, buf: &[u8]) -> Result<usize>
source
fn write(&mut self, buf: &[u8]) -> Result<usize>
sourceWrite a buffer into this writer, returning how many bytes were written. Read more
fn is_write_vectored(&self) -> bool
source
fn is_write_vectored(&self) -> bool
sourceDetermines if this Writer has an efficient write_vectored
implementation. Read more
fn flush(&mut self) -> Result<()>
source
fn flush(&mut self) -> Result<()>
sourceFlush this output stream, ensuring that all intermediately buffered contents reach their destination. Read more
fn write_all(&mut self, buf: &[u8]) -> Result<()>
source
fn write_all(&mut self, buf: &[u8]) -> Result<()>
sourceAttempts to write an entire buffer into this writer. Read more
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
source
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
sourceAttempts to write multiple buffers into this writer. Read more
impl<A> Write for Cursor<&mut Vec<u8, A>> where
A: Allocator,
1.25.0 · source
impl<A> Write for Cursor<&mut Vec<u8, A>> where
A: Allocator,
1.25.0 · sourcefn write(&mut self, buf: &[u8]) -> Result<usize>
source
fn write(&mut self, buf: &[u8]) -> Result<usize>
sourceWrite a buffer into this writer, returning how many bytes were written. Read more
fn is_write_vectored(&self) -> bool
source
fn is_write_vectored(&self) -> bool
sourceDetermines if this Writer has an efficient write_vectored
implementation. Read more
fn flush(&mut self) -> Result<()>
source
fn flush(&mut self) -> Result<()>
sourceFlush this output stream, ensuring that all intermediately buffered contents reach their destination. Read more
fn write_all(&mut self, buf: &[u8]) -> Result<()>
source
fn write_all(&mut self, buf: &[u8]) -> Result<()>
sourceAttempts to write an entire buffer into this writer. Read more
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
source
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
sourceAttempts to write multiple buffers into this writer. Read more
impl<A> Write for Cursor<Vec<u8, A>> where
A: Allocator,
source
impl<A> Write for Cursor<Vec<u8, A>> where
A: Allocator,
sourcefn write(&mut self, buf: &[u8]) -> Result<usize>
source
fn write(&mut self, buf: &[u8]) -> Result<usize>
sourceWrite a buffer into this writer, returning how many bytes were written. Read more
fn is_write_vectored(&self) -> bool
source
fn is_write_vectored(&self) -> bool
sourceDetermines if this Writer has an efficient write_vectored
implementation. Read more
fn flush(&mut self) -> Result<()>
source
fn flush(&mut self) -> Result<()>
sourceFlush this output stream, ensuring that all intermediately buffered contents reach their destination. Read more
fn write_all(&mut self, buf: &[u8]) -> Result<()>
source
fn write_all(&mut self, buf: &[u8]) -> Result<()>
sourceAttempts to write an entire buffer into this writer. Read more
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
source
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
sourceAttempts to write multiple buffers into this writer. Read more
impl<A> Write for Cursor<Box<[u8], A>> where
A: Allocator,
1.5.0 · source
impl<A> Write for Cursor<Box<[u8], A>> where
A: Allocator,
1.5.0 · sourcefn write(&mut self, buf: &[u8]) -> Result<usize>
source
fn write(&mut self, buf: &[u8]) -> Result<usize>
sourceWrite a buffer into this writer, returning how many bytes were written. Read more
fn is_write_vectored(&self) -> bool
source
fn is_write_vectored(&self) -> bool
sourceDetermines if this Writer has an efficient write_vectored
implementation. Read more
fn flush(&mut self) -> Result<()>
source
fn flush(&mut self) -> Result<()>
sourceFlush this output stream, ensuring that all intermediately buffered contents reach their destination. Read more
fn write_all(&mut self, buf: &[u8]) -> Result<()>
source
fn write_all(&mut self, buf: &[u8]) -> Result<()>
sourceAttempts to write an entire buffer into this writer. Read more
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
source
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
sourceAttempts to write multiple buffers into this writer. Read more
impl<const N: usize> Write for Cursor<[u8; N]>
1.61.0 · source
impl<const N: usize> Write for Cursor<[u8; N]>
1.61.0 · sourcefn write(&mut self, buf: &[u8]) -> Result<usize>
source
fn write(&mut self, buf: &[u8]) -> Result<usize>
sourceWrite a buffer into this writer, returning how many bytes were written. Read more
fn is_write_vectored(&self) -> bool
source
fn is_write_vectored(&self) -> bool
sourceDetermines if this Writer has an efficient write_vectored
implementation. Read more
fn flush(&mut self) -> Result<()>
source
fn flush(&mut self) -> Result<()>
sourceFlush this output stream, ensuring that all intermediately buffered contents reach their destination. Read more
fn write_all(&mut self, buf: &[u8]) -> Result<()>
source
fn write_all(&mut self, buf: &[u8]) -> Result<()>
sourceAttempts to write an entire buffer into this writer. Read more
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
source
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
sourceAttempts to write multiple buffers into this writer. Read more
impl<T: Eq> Eq for Cursor<T>
sourceimpl<T> StructuralEq for Cursor<T>
sourceimpl<T> StructuralPartialEq for Cursor<T>
sourceAuto Trait Implementations
impl<T> RefUnwindSafe for Cursor<T> where
T: RefUnwindSafe,
impl<T> Send for Cursor<T> where
T: Send,
impl<T> Sync for Cursor<T> where
T: Sync,
impl<T> Unpin for Cursor<T> where
T: Unpin,
impl<T> UnwindSafe for Cursor<T> where
T: UnwindSafe,
Blanket Implementations
impl<T> BorrowMut<T> for T where
T: ?Sized,
source
impl<T> BorrowMut<T> for T where
T: ?Sized,
sourcefn borrow_mut(&mut self) -> &mut T
const: unstable · source
fn borrow_mut(&mut self) -> &mut T
const: unstable · sourceMutably borrows from an owned value. Read more
impl<T> ToOwned for T where
T: Clone,
source
impl<T> ToOwned for T where
T: Clone,
sourcetype Owned = T
type Owned = T
The resulting type after obtaining ownership.
fn clone_into(&self, target: &mut T)
source
fn clone_into(&self, target: &mut T)
sourceUses borrowed data to replace owned data, usually by cloning. Read more