我在Dart的许多地方使用stdout.write(),以免转到新行。它工作正常,但最近已从同步更改为异步。我刚刚在Win7-32和Win8-64上升级到了Dart 28355。
以下描述了变化:
“有什么变化? 在所有平台上写入stdout和stderr曾经是阻塞的。作为清理的一部分,现在它与dart中的任何其他Streams异步/非阻塞:io。 如何更新我的代码? 大多数代码应该像以前一样工作,除了一些调用'exit'的情况:“
我想要实现的一个小例子如下:
import 'dart:io';
main() {
String sCorrectYn;
while (sCorrectYn != "y") {
String sName = fInputString("Enter Name : ");
sCorrectYn = fInputString("Details Correct? (y/n) : ");
}
}
String fInputString(String sPrompt) {
stdout.write("\n$sPrompt");
return stdin.readLineSync().toLowerCase();
}
在win8上运行上面的终端输出如下:
c:\Users\boh\dart-dev1\testpg001>dart testinput001.dart
Enter Name : abcd
n
xxxx
n
zzzz
y
Details Correct? (y/n) :
Enter Name :
Details Correct? (y/n) :
Enter Name :
Details Correct? (y/n) :
c:\Users\boh\dart-dev1\testpg001>
上面发生的是在我最终输入“y”之后出现所有终端输出,它终止程序并刷新输出缓冲区(它出现)。第一个终端输出“输入名称:”是应该发生的唯一输出。
stdout似乎没有“flush”方法。
我使用stdout进行了未来的实验,但我无法正常运行。
如何以所需的方式使其工作?
使用stdout.write()时,以下内容也无法正常工作:
import 'dart:io';
main() {
String sInput;
stdout.write("\nEntry 1 : ");
sInput = stdin.readLineSync();
print("Date Entered (1) was : $sInput");
stdout.write("\nEntry 2 : ");
sInput = stdin.readLineSync();
print("Date Entered (2) was : $sInput");
stdout.write("\nEntry 3 : ");
sInput = stdin.readLineSync();
print("Date Entered (3) was : $sInput");
stdout.write("\nEntry 4 : ");
sInput = stdin.readLineSync();
print("Date Entered (4) was : $sInput");
stdout.write("\nEntry 5 : ");
sInput = stdin.readLineSync();
print("Date Entered (5) was : $sInput");
}
上面的终端显示显示第1行“Entry 1:”仅在使用stdout.write()时显示行:
c:\Users\boh\dart-dev1\testpg001>dart testinput003.dart
Entry 1 : aaa
Date Entered (1) was : aaa
bbb
Date Entered (2) was : bbb
ccc
Date Entered (3) was : ccc
ddd
Date Entered (4) was : ddd
eee
Date Entered (5) was : eee
Entry 2 :
Entry 3 :
Entry 4 :
Entry 5 :
c:\Users\boh\dart-dev1\testpg001>
答案 0 :(得分:0)
使用IOSink
创建可以等待的新StreamController
,可以实现“刷新”Stream
的功能。我使用writeAndFlush
辅助方法重写了上面的示例。
import 'dart:async';
import 'dart:convert';
import 'dart:io';
main() {
void loop() {
fInputString("Enter Name : ")
.then((_) => fInputString("Details Correct? (y/n) : "))
.then((sCorrectYn) {
if (sCorrectYn != "y") loop();
});
}
loop();
}
Future<String> fInputString(String sPrompt) {
return writeAndFlush(stdout, "\n$sPrompt")
.then((_) {
return stdin.readLineSync().toLowerCase();
});
}
Future writeAndFlush(IOSink sink, object) {
return sink.addStream(
(new StreamController()
..add(UTF8.encode(object.toString()))
..close())
.stream);
}
向IOSink添加flush
,这正是我们应该考虑的选项。
请注意,这实际上并非在IO级别上“刷新”,但它会等待Stream
被读取结束,即等待Stream
可能暂停并且由OS恢复。