【问题标题】:How do you set a Dart IO Process to use an existing Stream for its stdin?如何设置 Dart IO 进程以将现有 Stream 用作其标准输入?
【发布时间】:2026-01-11 19:15:01
【问题描述】:

我正在使用 Process.start 创建一个 Process 并且有点卡在 stdin getter 上。理想情况下,我在其他地方设置了一个 StreamController,我想将它的字符串流传递给标准输入。但是与 Process.stdin 交互的复杂示例并不多,所以我不确定除了 writeln 到 stdin 之外如何做任何事情。

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

  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&lt;List&lt;int&gt;&gt;,但我不知道为什么会这样。

【问题讨论】:

    标签: dart dart-io


    【解决方案1】:

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

    process.stdin.addStream(input.stream)
    

    你可以的

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

    您可能需要一些错误处理,可能需要在写入之间刷新标准输入,所以也许:

    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&lt;int&gt; 的原因是进程通信的核心是字节。发送文本需要发送者和接收者预先同意编码,因此他们可以以相同的方式解释字节。

    【讨论】:

    • 对编码方法的发送/接收理解是有意义的。谢谢!
    【解决方案2】:

    这可能有效

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

    【讨论】:

      最近更新 更多