首页 > 解决方案 > 如何在不使用大量内存的情况下将所有标准输入写入标准输出?

问题描述

我想编写一个 Rust 程序,它将 stdin 中的所有内容复制到 stdout。到目前为止我有这个

fn main() {
    let mut stdin: io::Stdin = io::stdin();    
    let mut stdout: io::Stdout = io::stdout();

    let mut buffer: [u8; 1_000_000] = [0; 1_000_000];
    let mut n_bytes_read: usize = 0;
    let mut uninitialized: bool = true;
    while uninitialized || n_bytes_read > 0
    {
        n_bytes_read = stdin.read(&mut buffer).expect("Could not read from STDIN.");
        uninitialized = false;
    }
}

我将所有内容复制到大小为 100 万的缓冲区中,以免在有人向我的程序提供 3 GB 文件时炸毁内存。所以现在我想将它复制到标准输出,但我能找到的唯一原始写操作是stdout.write(&mut buffer)- 但这会写入整个缓冲区!我需要一种方法来写入特定数量的字节,例如stdout.write_only(&mut buffer, n_bytes_read).

我想以最基本的方式做到这一点,并使用最少的标准库导入。

标签: rust

解决方案


如果您只想在不使用太多内存的情况下从标准输入复制到标准输出,只需使用std::io::copy即可。它将数据从读取器流式传输到写入器。

如果您的目标是写入缓冲区的一部分,则取该缓冲区的一部分并将其传递给write

stdout.write(&buffer[0..n_bytes_read]);

切片不会复制数据,因此您不会使用更多内存。

但是请注意,这write可能不会写出您所要求的所有内容 - 它返回实际写入的字节数。如果您使用write_all它将写入整个切片。


推荐阅读