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);
}