Dart разделяет длинные данные stdout на два события ProcessResult

122
10

При прослушивании длинного строкового вывода из процесса оболочки я получаю данные в двух фрагментах. Как я могу получить весь текст?

Вот код, о котором идет речь:

int i = 0;
Process.start('perl', ['print_text.pl']).then((Process p) {
p.stdout.transform(UTF8.decoder).listen((data) => print("${i++} ${data}"));
p.stdin.writeln('print');
});

Результатом запуска этого кода является:

0 текст.....

1 текст.....

Я сообщил об этой проблеме как об ошибке здесь. Вы можете запустить пример приложения, прикрепленного к отчету, чтобы увидеть проблему.

спросил(а) 2021-01-19T21:57:23+03:00 2 месяца, 3 недели назад
1
Решение
62

Я решил эту проблему, выполнив следующие действия:

В сценарии оболочки помечайте начало и конец вывода оболочки случайным числом. В Dart объедините все куски вместе и используйте теги, чтобы проверить, получили ли вы полный результат.

Это решение не требует выхода из процесса для получения результата процесса.

Это пример кода:

 String text = '';
process.stdout.transform(UTF8.decoder).listen((String chunk) {
text = text + chunk;
if (text.substring(errors.length - 1) == text.substring(0, 1)) {
text = text.replaceFirst(new RegExp(r'^(\d+)'), '').replaceFirst(new RegExp(r'(\d+)$'), '');
// use process result then clear text value for subsequent process results
text = '';
}
});

ответил(а) 2021-01-19T21:57:23+03:00 2 месяца, 3 недели назад
62

Попробуйте использовать UTF8.decodeStream().


import 'dart:io';
import 'dart:convert' show UTF8;

main() {
Process.start('ls', ['-la'])
.then((p) => UTF8.decodeStream(p.stdout))
.then((s) => print('Output:\n$s'));
}

ответил(а) 2021-01-19T21:57:23+03:00 2 месяца, 3 недели назад
44

Неясно, каков фактический вопрос, но я предполагаю, что это то, что вы ищете:

import 'dart:io';
import 'dart:convert' show UTF8;

void main() {
int i = 0;
String text = '';
Process.start('perl', ['analyze.pl']).then((p) {
p.stdout.transform(UTF8.decoder).listen((data) =>
text += data);
p.exitCode.then((_) => print(text));
});
}

ответил(а) 2021-01-19T21:57:23+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема