snippetrustMajor
How to create an in-memory object that can be used as a Reader, Writer, or Seek in Rust?
Viewed 0 times
seekobjecthowreaderusedwriterrustcanthatmemory
Problem
I need a completely in-memory object that I can give to
Is there a way to do this using the standard library?
BufReader and BufWriter. Something like Python's StringIO. I want to write to and read from such an object using methods ordinarily used with Files.Is there a way to do this using the standard library?
Solution
In fact there is a way:
(please also read Shepmaster's answer on why often it's even easier)
In the documentation you can see that there are the following impls:
From this you can see that you can use the type
Little example (Playground):
For a more useful example, check the documentation linked above.
Cursor! (please also read Shepmaster's answer on why often it's even easier)
In the documentation you can see that there are the following impls:
impl Seek for Cursor where T: AsRef
impl Read for Cursor where T: AsRef
impl Write for Cursor>
impl AsRef for VecFrom this you can see that you can use the type
Cursor> just as an ordinary file, because Read, Write and Seek are implemented for that type! Little example (Playground):
use std::io::{Cursor, Read, Seek, SeekFrom, Write};
// Create fake "file"
let mut c = Cursor::new(Vec::new());
// Write into the "file" and seek to the beginning
c.write_all(&[1, 2, 3, 4, 5]).unwrap();
c.seek(SeekFrom::Start(0)).unwrap();
// Read the "file's" contents into a vector
let mut out = Vec::new();
c.read_to_end(&mut out).unwrap();
println!("{:?}", out);For a more useful example, check the documentation linked above.
Code Snippets
impl<T> Seek for Cursor<T> where T: AsRef<[u8]>
impl<T> Read for Cursor<T> where T: AsRef<[u8]>
impl Write for Cursor<Vec<u8>>
impl<T> AsRef<[T]> for Vec<T>use std::io::{Cursor, Read, Seek, SeekFrom, Write};
// Create fake "file"
let mut c = Cursor::new(Vec::new());
// Write into the "file" and seek to the beginning
c.write_all(&[1, 2, 3, 4, 5]).unwrap();
c.seek(SeekFrom::Start(0)).unwrap();
// Read the "file's" contents into a vector
let mut out = Vec::new();
c.read_to_end(&mut out).unwrap();
println!("{:?}", out);Context
Stack Overflow Q#41069865, score: 89
Revisions (0)
No revisions yet.