Rust 如何创建一个内存中的对象,该对象可以用作读卡器、写入器或查找器?

Rust 如何创建一个内存中的对象,该对象可以用作读卡器、写入器或查找器?,rust,in-memory,Rust,In Memory,我需要一个完全在内存中的对象,我可以将它提供给BufReader和BufWriter。类似于Python的StringIO。我想使用Files通常使用的方法对这样的对象进行写入和读取 使用标准库有没有办法做到这一点?事实上有一种方法: (请阅读为什么经常更容易) 在文档中,您可以看到以下impl: impl<T> Seek for Cursor<T> where T: AsRef<[u8]> impl<T> Read for Cursor<T

我需要一个完全在内存中的对象,我可以将它提供给
BufReader
BufWriter
。类似于Python的
StringIO
。我想使用
File
s通常使用的方法对这样的对象进行写入和读取


使用标准库有没有办法做到这一点?

事实上有一种方法:
(请阅读为什么经常更容易)

在文档中,您可以看到以下impl:

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>

有关更有用的示例,请查看上面链接的文档。

事实上有一种方法:
(请阅读为什么经常更容易)

在文档中,您可以看到以下impl:

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>

有关更有用的示例,请查看上面链接的文档。

如果要将
BufReader
与内存中的
字符串一起使用,可以使用
as_bytes()
方法:

use std::io::BufRead;
use std::io::BufReader;
use std::io::Read;

fn read_buff<R: Read>(mut buffer: BufReader<R>) {
    let mut data = String::new();
    let _ = buffer.read_line(&mut data);

    println!("read_buff got {}", data);
}

fn main() {
    read_buff(BufReader::new("Potato!".as_bytes()));
}

如果要将
BufReader
与内存中的
字符串一起使用,可以使用
as_bytes()
方法:

use std::io::BufRead;
use std::io::BufReader;
use std::io::Read;

fn read_buff<R: Read>(mut buffer: BufReader<R>) {
    let mut data = String::new();
    let _ = buffer.read_line(&mut data);

    println!("read_buff got {}", data);
}

fn main() {
    read_buff(BufReader::new("Potato!".as_bytes()));
}

大多数情况下,您不需要
光标

我可以给
BufReader
BufWriter

BufReader
需要一个实现
Read
的值:

impl<R: Read> BufReader<R> {
    pub fn new(inner: R) -> BufReader<R>
}

如果您查看的是的实现者,您将发现
impl在大多数情况下不需要
光标

我可以给
BufReader
BufWriter

BufReader
需要一个实现
Read
的值:

impl<R: Read> BufReader<R> {
    pub fn new(inner: R) -> BufReader<R>
}

如果您查看的实现者,您将发现
impl,您可以在使用
光标后执行
@Shepmaster很棒!然后我可以使用转换为字符串,
from_utf8
似乎避免了向量的复制,所以它应该是有效的,也可以使用'from_utf8_unchecked',这应该是一个简单的移动。你可以在用
光标完成后
@Shepmaster很棒!然后我可以使用转换为字符串,
from_utf8
似乎可以避免向量的复制,因此它应该是有效的,也可以使用'from_utf8_unchecked',这应该是一个简单的移动。这很好。这是一年前我们做不到的吗?@liszt-nope,这些实现存在于rust1.0中。这太棒了。这是一年前我们做不到的吗?@liszt-nope,这些实现存在于rust1.0中。
use std::io::{Read, Write};

fn main() {
    // Create fake "file"
    let mut file = Vec::new();

    // Write into the "file"
    file.write_all(&[1, 2, 3, 4, 5]).unwrap();

    // Read the "file's" contents into a new vector
    let mut out = Vec::new();
    let mut c = file.as_slice();
    c.read_to_end(&mut out).unwrap();

    println!("{:?}", out);
}