gpt4 book ai didi

rust - 如何写入 BufWriter 并获取写入的内容?

转载 作者:行者123 更新时间:2023-11-29 08:10:46 30 4
gpt4 key购买 nike

有没有一种方法可以使用 Writer 并将写入此 writer 的内容取回?像 BufWriterReader 这样的东西?我试过这个,但没有编译:

#[test]
fn write_to_json_test0() {
let json = get_schema_without_optionals0(); // this is a thing serde_json can (de)serialize
let buf = Vec::new();
let writer = BufWriter::new(buf); // buf moves here

serde_json::to_writer(writer, &json).unwrap(); // writer moves here

let s = String::from_utf8(writer.into_inner().unwrap()).unwrap(); // compile error, because writer used after move

assert_eq!(s, json.to_string());
}

a pull-request for a BufWriter::buffer() ,但现在不可用。

测试 to_string()to_writer() 是否返回相同的最快方法是什么?我真的需要写入文件并将文件读取为字符串吗?

最佳答案

the fastest way to test if to_string() and to_writer() returns the same

the source code for to_string :

let vec = try!(to_vec(value));
let string = unsafe {
// We do not emit invalid UTF-8.
String::from_utf8_unchecked(vec)
};
Ok(string)

调用 to_vec :

let mut writer = Vec::with_capacity(128);
try!(to_writer(&mut writer, value));
Ok(writer)

粘在一起,和你的代码差不多:

let mut writer = Vec::with_capacity(128);
to_writer(&mut writer, value)?;
let string = unsafe {
// We do not emit invalid UTF-8.
String::from_utf8_unchecked(writer)
};
Ok(string)

但是效率更高:

  • 它在 Vec 中预分配了一些空间
  • 它避免了 BufWriter(如 Sven Marnach points out )
  • 它跳过 UTF-8 有效性检查

a pull-request for a BufWriter::buffer()

不,在合并和发布拉取请求之前,您无法访问 BufWriter 的缓冲区 — 这是添加它的部分原因!

written to this writer

您似乎没有完全理解 BufWriter 的用途。它缓冲您向其写入的数据,以便底层编写器不会获取它。缓冲区中的数据是底层编写器还没有看到的数据。您引用的拉取请求对您没有帮助

事实上,您需要确保flush BufWriter 以确保在尝试解析底层Vec< 之前缓冲区中没有数据残留 作为一个字符串。值得庆幸的是,into_inner 已经为您做到了。

writer moves here

这是因为 Serde 遵循“C-RW-VALUE”指南:Generic reader/writer functions take R: Read and W: Write by value .您可以使用 Write::by_ref 避免放弃作者的所有权。 :

#[test]
fn write_to_json_test0() -> Result<(), io::Error> {
let json = Value::Number(42.into());

let buf = Vec::new();
let mut writer = BufWriter::new(buf);
serde_json::to_writer(writer.by_ref(), &json)?;
let s = String::from_utf8(writer.into_inner()?).unwrap();

assert_eq!(s, json.to_string());
Ok(())
}

这是有效的,因为 by_ref 返回一个对作者的可变引用,并且有一个一揽子实现 Write for any mutable reference to a type that itself implements Write :

impl<'a, W: Write + ?Sized> Write for &'a mut W

by_ref 只是一个方便的函数,可以避免显式获取可变引用的相对奇怪的语法。 by_ref 的这种模式在 ReadIterator 中重复。

另见:

关于rust - 如何写入 BufWriter 并获取写入的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53011844/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com