Dart将长标准输出数据拆分为两个ProcessResult事件

hec6srdp  于 2022-12-20  发布在  其他
关注(0)|答案(3)|浏览(151)

当监听shell进程输出的长字符串时,我收到的数据分为两块,如何才能得到完整的文本?
下面是所讨论的代码:

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个文本.....
我已经将此问题报告为bug here。您可以运行报告附件中的示例应用程序来查看此问题。

c2e8gylq

c2e8gylq1#

尝试使用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'));
}
q1qsirdb

q1qsirdb2#

我通过执行以下操作解决了此问题:
1.在shell脚本中,用随机数标记shell输出的开始和结束。
1.在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 = '';
      }
 });
9njqaruj

9njqaruj3#

目前还不清楚实际的问题是什么,但我假设这就是您正在寻找的:

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));
  });
}

相关问题