rust - 如何在不使用大量内存的情况下将所有标准输入写入标准输出?
问题描述
我想编写一个 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)
.
我想以最基本的方式做到这一点,并使用最少的标准库导入。
解决方案
如果您只想在不使用太多内存的情况下从标准输入复制到标准输出,只需使用std::io::copy即可。它将数据从读取器流式传输到写入器。
如果您的目标是写入缓冲区的一部分,则取该缓冲区的一部分并将其传递给write
:
stdout.write(&buffer[0..n_bytes_read]);
切片不会复制数据,因此您不会使用更多内存。
但是请注意,这write
可能不会写出您所要求的所有内容 - 它返回实际写入的字节数。如果您使用write_all
它将写入整个切片。
推荐阅读
- vba - 在两个比较范围内显示单元格值匹配的地址
- python - 如何在python中使用OpenCV拼接多个随机顺序的图像?
- dataframe - Holoviews 多边形输入
- javascript - 如何从javascript中的json数组中删除双引号
- c - 在c代码中取4位数字
- google-app-engine - 将 App Engine Flex 限制为仅在没有 App Engine 防火墙的情况下进行内部访问?
- cognos - Cognos 条形图第二个轴条与第一个轴条重叠
- sql-server - 如何优化存储过程中的游标
- typescript - webpack找不到src,但它不应该在寻找它
- google-app-maker - 将转换器绑定到计算表达式