【问题标题】:If BufReader takes ownership of a stream, how can I read and write lines on it?如果 BufReader 拥有流的所有权,我如何在其上读取和写入行?
【发布时间】:2016-06-22 11:58:26
【问题描述】:

我想从TCPStream 中读取一行,再写一行,然后重复。问题是BufReader::new 拥有我的TCPStream 变量的所有权:

let stream = ...; // TCPStream

let reader = BufReader::new(stream); // moved its value

// can't use stream here anymore

有什么简单的解决方案?

【问题讨论】:

标签: tcp rust tcp-ip


【解决方案1】:

解决方案:使用引用。

let mut stream = ...;
let reader = BufReader::new(&stream);
let writer = BufWriter::new(&stream);

说明

如果我们仔细查看BufReader::new,我们会发现它需要一个R 类型的参数inner,其中R 是实现Read 的任何类型:

impl<R: Read> BufReader<R> {
    pub fn new(inner: R) -> BufReader<R> { ... }
}

然后我们看一下Read,看看这个实现:

impl<'a> Read for &'a TcpStream

所以我们可以只传递对new 函数的引用,如下所示:

let reader = BufReader::new(&stream);

我们将对BufWriterWrite 做同样的事情,并且会看到确实有这个实现:

impl<'a> Write for &'a TcpStream

所以我们可以再次使用不可变引用来创建BufWriter

【讨论】:

【解决方案2】:

你有几种可能:

  • 不要使用BufReader
  • 使用get_mut暂时从BufReader借用流
  • 完全丢弃BufReader 并使用into_inner 恢复流

我个人建议不要使用BufReader,除非你真的需要缓冲输入;对于单行来说,这似乎不值得。

否则,如果你完成了缓冲,你可以恢复底层流,如果你没有,你可以暂时缓冲它。

警告请注意BufReader 缓冲读取,因此当您借用/恢复内部流时,您会短路缓冲数据;阅读它是一个问题,在你的情况下(写作)应该没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多