Как настроить процесс ввода-вывода Dart для использования существующего потока в качестве стандартного ввода?

Я создаю процесс, используя Process.start, и немного застрял с получателем stdin. В идеале у меня есть 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>>, хотя не уверен, почему это так.


person Crunchex    schedule 19.01.2015    source источник


Ответы (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>, заключается в том, что обмен данными с процессами по своей сути является просто байтами. Для отправки текста отправитель и получатель должны предварительно согласовать кодировку, чтобы они могли интерпретировать байты одинаково.

person lrn    schedule 20.01.2015
comment
Понимание метода кодирования при отправке / получении имеет смысл. Спасибо! - person Crunchex; 20.01.2015

Это может сработать

process.stdin.addStream(UTF8.encoder.bind(input.stream));
person Günter Zöchbauer    schedule 20.01.2015