在Dart中,从进程流式传输标准输出的最佳方式是什么?

在Dart中,从进程流式传输标准输出的最佳方式是什么?,dart,dart-io,Dart,Dart Io,我想运行一个进程,并将进程的stdout流式传输到控制台。实现这一点的最佳方法是什么(最有效、最容易理解、代码行数最少) 例如: var process = await Process.start(exec, args); 我想尽快看到任何标准内容 谢谢 这里有一种方法: var process = await Process.start(exec, args); stdout.addStream(process.stdout); 注意,我将process.stdout流添加到正常的stdo

我想运行一个进程,并将进程的stdout流式传输到控制台。实现这一点的最佳方法是什么(最有效、最容易理解、代码行数最少)

例如:

var process = await Process.start(exec, args);
我想尽快看到任何标准内容

谢谢

这里有一种方法:

var process = await Process.start(exec, args);
stdout.addStream(process.stdout);
注意,我将
process.stdout
流添加到正常的
stdout
流中,该流来自
dart:io

import 'dart:io';
void main() async {
   var process = await Process.start(exec, args);
   process.stdout.pipe(stdout);
}
或者使用
然后

import 'dart:io';
void main() {
   Process.start(exec, args).then(
      (process) => process.stdout.pipe(stdout)
   );
}

为了完整起见,您可以在
过程中使用
模式
参数。启动
并传递


不过要小心,正如模式的名称所暗示的,这将把所有stdio从进程(stdin、stdout和stderr)传递到默认stdout,这可能会导致意外的结果,因为像sigterms这样的东西也被传递了。

我想知道这和addStream之间的优缺点是什么?
.pipe()
本身只调用
addStream()
;-),但除此之外,当源流在没有错误的情况下关闭时,它也会自动关闭目标流。如果它在进程完成之前关闭了进程的标准流,这会不会发生一些意外的事情?您不能关闭它,因为控制器是进程的专用控制器。你所能做的就是停止监听,这不会有任何影响,除非不能在流中获得进一步的输出。
var process = await Process.start(
  command,
  args,
  mode: ProcessStartMode.inheritStdio
);