如何将 std::io::Bytes 转换为 &[u8] ?

13

我正在尝试将HTTP响应的内容写入文件。

extern crate reqwest;

use std::io::Write;
use std::fs::File;

fn main() {
    let mut resp = reqwest::get("https://www.rust-lang.org").unwrap();
    assert!(resp.status().is_success());

    // Write contents to disk.
    let mut f = File::create("download_file").expect("Unable to create file");
    f.write_all(resp.bytes());
}

但是我收到了以下编译错误:

error[E0308]: mismatched types
  --> src/main.rs:12:17
   |
12 |     f.write_all(resp.bytes());
   |                 ^^^^^^^^^^^^ expected &[u8], found struct `std::io::Bytes`
   |
   = note: expected type `&[u8]`
              found type `std::io::Bytes<reqwest::Response>`
1个回答

14
你无法这样做。查看 io::Bytes 的文档,没有合适的方法。这是因为 io::Bytes 是一个逐字节返回东西的迭代器,所以可能甚至没有一个底层数据切片存在。
如果你只有 io::Bytes,则需要将迭代器collect到一个 Vec 中:
let data: Result<Vec<_>, _> = resp.bytes().collect();
let data = data.expect("Unable to read data");
f.write_all(&data).expect("Unable to write data");

然而,在大多数情况下,你可以访问实现了Read的类型,因此你可以使用Read::read_to_end代替:

let mut data = Vec::new();
resp.read_to_end(&mut data).expect("Unable to read data");
f.write_all(&data).expect("Unable to write data");

在这种情况下,您可以使用io::copy来直接从Request复制到文件,因为Request实现了io::Read,而File实现了io::Write

extern crate reqwest;

use std::io;
use std::fs::File;

fn main() {
    let mut resp = reqwest::get("https://www.rust-lang.org").unwrap();
    assert!(resp.status().is_success());

    // Write contents to disk.
    let mut f = File::create("download_file").expect("Unable to create file");
    io::copy(&mut resp, &mut f).expect("Unable to copy data");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接