На самом деле есть способ. Знакомьтесь: Cursor<T>
!
В документации вы можете увидеть, что существуют следующие impls:
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>
Из этого вы можете видеть, что вы можете использовать тип Cursor<Vec<u8>>
так же, как обычный файл, потому что Read
, Write
и Seek
реализованы для этого типа!
Маленький пример (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);
Для более полезной, например, проверить документацию, связанную выше.
Вы можете [Получить 'Vec' назад] (https://doc.rust-lang.org/std/io/struct.Cursor.html#method.into_inner) после того, как вы сделали с' Cursor'. – Shepmaster
@Shepmaster Отлично! И затем я могу использовать ['from_utf8'] (https://doc.rust-lang.org/std/str/fn.from_utf8.html) для свертывания в String,' from_utf8', кажется, не копирует вектор так, чтобы он должен быть эффективен, можно также использовать 'from_utf8_unchecked ', который должен быть простым. –