如何设置 Dart IO Process 以使用现有 Stream 作为其标准输入?
How do you set a Dart IO Process to use an existing Stream for its stdin?
我正在使用 Process.start 创建一个进程,但有点受困于标准输入 getter。理想情况下,我在其他地方设置了一个 StreamController,我想将其字符串流传递到标准输入中。但是没有太多与 Process.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<List<int>>
,但我不确定为什么会这样。
这可能有效
process.stdin.addStream(UTF8.encoder.bind(input.stream));
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<int>
的原因是进程通信的核心只是字节。发送文本需要发送方和接收方预先就编码达成一致,这样他们才能以相同的方式解释字节。
我正在使用 Process.start 创建一个进程,但有点受困于标准输入 getter。理想情况下,我在其他地方设置了一个 StreamController,我想将其字符串流传递到标准输入中。但是没有太多与 Process.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<List<int>>
,但我不确定为什么会这样。
这可能有效
process.stdin.addStream(UTF8.encoder.bind(input.stream));
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<int>
的原因是进程通信的核心只是字节。发送文本需要发送方和接收方预先就编码达成一致,这样他们才能以相同的方式解释字节。