我想从一个已知偏移量和大小的文件中读取一个 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))
}
在我的代码中,我不喜欢两件事:
我用0初始化了
Vec
,但这没用,因为在 下一行我调用file.read_exact
。我可以在没有的情况下在堆中分配内存吗 正在初始化吗?我在堆上创建了
Vec
,最后我通过String
再次分配内存。我分配相同数量的内存并从一个位置复制到另一个位置。是否可以使用length
内存要求而不是2 * length
来实现此功能?
最佳答案
Rust 没有“只写”内存的概念,因此避免初始化
Vec
的唯一方法是使用unsafe
代码。除非您可以证明这是您程序的实际性能问题,否则请保持原样。你可以使用
String::from_utf8
相反,它就地进行转换。
关于rust - 如何优化从具有已知偏移量和大小的文件中读取 UTF-8 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38161695/