【问题标题】:Rust: How do I convert/read a BytesMut to a file?Rust:如何将 BytesMut 转换/读取为文件?
【发布时间】:2020-04-03 05:25:02
【问题描述】:

我有一个BytesMut 类型的值(来自bytes

此值的来源是我从远程源(在本例中为 AWS S3 存储桶)下载的文件。 我想将这些字节(它是一个图像)存储(写入)到一个文件中,以便我可以继续读取图像文件,进行一些处理等。

最好/最简单的方法是什么?

我看过这个question,但它并没有帮助我,因为我认为它正在做与我正在尝试的相反的事情。 任何帮助将不胜感激,谢谢!

【问题讨论】:

  • A BytesMut derefs 到一个切片中,因此您可以使用 &b[..] 访问其全部内容。 File::create("filename").write_all(&b[..])? 是你要找的吗?
  • 查看代码的相关部分会很有用。有一些我不清楚的事情,例如如果您只想再次读取数据,为什么要将数据写入磁盘?如果由于某种原因需要将数据写入磁盘,为什么要先将其下载到内存,而不是直接将其流式传输到文件?如果文件不是太大,这并不重要,但无论如何共享实际代码通常会产生更有用的答案。
  • 是的 @user4815162342 这行得通,非常感谢!我使用as_ref() 将其转换为 &[u8] 然后我可以将其写入文件。
  • @SvenMarnach 这些都是好问题,我现在正试图自己找出答案。感谢您指出这些东西。我已经有现有的函数,在另一个模块中使用不同的库,它接受图像的路径然后将其读入。也许为了分离关注点,我会这样做。虽然,它确实有一些开销,并且需要我在完成后删除我下载的每个文件(因为我希望这段代码能够处理数千张图像)。
  • @KahlilAbreu 听起来读取图像的函数应该接受并实现Read(或者可能是AsyncRead)而不是路径。这将允许您传递文件对象或缓冲区对象,甚至是 HTTP 连接的数据流。

标签: rust rust-tokio


【解决方案1】:

BytesMut 取消引用为slice of u8,因此您可以使用&b[..] 访问其全部内容。要将其写入文件,请在接受切片的 Write 值上使用 write_all 方法:

let b: BytesMut = ...;
File::create("filename").write_all(&b[..])?;

【讨论】:

    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2014-09-16
    • 1970-01-01
    相关资源
    最近更新 更多