如何设置Dart IO Process以将现有Stream用于其stdin?

时间:2015-01-19 23:46:12

标签: dart dart-io

我正在使用Process.start创建一个进程,并且我对stdin getter有点困惑。理想情况下,我在其他地方设置了一个StreamController,它的字符串流我想传入stdin。但是没有太多复杂的例子可以与Process.stdin进行交互,所以我不知道除了写入stdin之外什么都不做。

所以我有这样的东西,我可以将String消息添加到:

  StreamController<String> processInput = new StreamController<String>.broadcast();

我想做这样的事情:

  Process.start(executable, args, workingDirectory: dir.path, runInShell: true).then((Process process) {
process.stdout
  .transform(UTF8.decoder)
  .listen((data) {
    s.add('[[CONSOLE_OUTPUT]]' + data);
  });
process.stdin.addStream(input.stream);
});

我意识到addStream()想要Stream<List<int>>,但我不确定为什么会这样。

2 个答案:

答案 0 :(得分:2)

stdin对象是IOSink,因此它对字符串有write方法。这将默认为UTF-8编码字符串。 所以,而不是

process.stdin.addStream(input.stream)

你可以做到

IOSink stdin = process.stdin;
input.stream.listen(stdin.write, onDone: stdin.close);

您可能需要一些错误处理,可能在写入之间刷新stdin,所以可能:

input.stream.listen(
    (String data) {
      stdin.write(data);
      stdin.flush();
    }, 
    onError: myErrorHandler,
    onDone: stdin.close);

或者,您可以手动执行UTF-8编码,以获取addStream期望的整数列表流:

process.stdin.addStream(input.stream.transform(UTF8.encoder))

stdin期望List<int>的原因是进程通信的核心只是字节。发送文本要求发送方和接收方预先就编码达成一致,这样他们就可以用相同的方式解释字节。

答案 1 :(得分:1)

这可能有效

process.stdin.addStream(UTF8.encoder.bind(input.stream));