rust - 如何优化从具有已知偏移量和大小的文件中读取 UTF-8 字符串?

标签 rust

我想从一个已知偏移量和大小的文件中读取一个 UTF-8 字符串, 所以我写道:

fn test(file: &mut File, offset: u64, length: usize) -> Result<String, String> {
    try!(file.seek(SeekFrom::Start(offset)).map_err(|err| err.to_string()));
    let mut buffer = Vec::<u8>::with_capacity(length);
    buffer.resize(length, 0_u8);
    try!(file.read_exact(& mut buffer).map_err(|err| err.to_string()));
    let utf8_s = try!(from_utf8(&buffer).map_err(|err| "invalid utf-8 data in data".to_string()));
    Result::Ok(String::from(utf8_s))
}

在我的代码中,我不喜欢两件事:

  1. 我用0初始化了Vec,但这没用,因为在 下一行我调用 file.read_exact。我可以在没有的情况下在堆中分配内存吗 正在初始化吗?

  2. 我在堆上创建了 Vec,最后我通过 String 再次分配内存。我分配相同数量的内存并从一个位置复制到另一个位置。是否可以使用 length 内存要求而不是 2 * length 来实现此功能?

最佳答案

  1. Rust 没有“只写”内存的概念,因此避免初始化 Vec 的唯一方法是使用 unsafe 代码。除非您可以证明这是您程序的实际性能问题,否则请保持原样。

  2. 你可以使用 String::from_utf8相反,它就地进行转换。

关于rust - 如何优化从具有已知偏移量和大小的文件中读取 UTF-8 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38161695/

相关文章:

multithreading - Rust 中使用的 "await"是什么意思?

返回 Vec<&str> 时字符串的生命周期

memory-management - Rust 手动内存管理

pointers - Rust 的 Arc 和 Rc 类型与垃圾收集有何不同?

rust - 如何将两个 u8 原语转换为 u16 原语?

asynchronous - 如何在不使用 tokio::spawn 的情况下循环运行多个 Tokio 异步任务?

vector - 如何在 Rust 中提取字符串向量的元素?

opengl - 附加了分割着色器时,glDrawArrays失败

arrays - 如何将 GenericArray<T, ?> 转换为相同长度的数组?

rust - 穷举整数匹配