Dart Stdout
最后修改于 2025 年 4 月 4 日
Dart 中的 Stdout 类提供了向控制台写入输出的方法。它是 Dart 的 dart:io 库的一部分,对于命令行应用程序至关重要。
Stdout 比基本的 print 语句提供了更多的控制,包括字节级写入、行控制和同步操作。它是 Dart 中与控制台输出交互的标准方式。
基本定义
Stdout 是一个表示标准输出的抽象类。它通常通过 dart:io 库中的 stdout 访问。
主要功能包括文本和字节写入、行控制以及终端交互。它支持同步和异步操作以适应不同的用例。
Stdout 的基本用法
此示例显示了使用 Stdout 的基本控制台输出。
main.dart
import 'dart:io';
void main() {
stdout.write('Hello, ');
stdout.write('Dart!');
stdout.writeln();
stdout.writeln('This is a new line');
print('Using print() for comparison');
}
我们使用 write() 进行连续输出,使用 writeln() 进行带行尾的输出。与 print() 不同,Stdout 方法不会自动添加换行符。
$ dart main.dart Hello, Dart! This is a new line Using print() for comparison
将字节写入 Stdout
此示例演示了将原始字节写入标准输出。
main.dart
import 'dart:io';
void main() {
// Write bytes directly
stdout.add([72, 101, 108, 108, 111]); // 'Hello' in ASCII
// Write a single byte
stdout.writeByte(10); // Newline character
// Write from a stream
var stream = Stream.fromIterable([66, 121, 101]);
stdout.addStream(stream).then((_) {
stdout.writeln();
});
}
我们使用 add() 处理字节列表,使用 writeByte() 处理单个字节,并使用 addStream() 处理异步字节流。这对于二进制数据非常有用。
$ dart main.dart Hello Bye
控制行行为
此示例演示了 Stdout 的不同行写入技术。
main.dart
import 'dart:io';
void main() {
// Write without newline
stdout.write('First line');
// Force immediate output
stdout.flush();
// Write with newline
stdout.writeln('Second line');
// Write multiple lines
stdout.writeAll(['Third', 'Fourth', 'Fifth'], '\n');
stdout.writeln();
}
flush() 确保输出立即写入。writeAll() 使用分隔符写入多个项目。这些方法提供了对行尾的精确控制。
$ dart main.dart First lineSecond line Third Fourth Fifth
检查终端功能
此示例演示了在输出前检查终端属性。
main.dart
import 'dart:io';
void main() {
if (stdout.hasTerminal) {
print('Terminal width: ${stdout.terminalColumns}');
print('Terminal height: ${stdout.terminalLines}');
if (stdout.supportsAnsiEscapes) {
stdout.writeln('\x1B[31mRed Text\x1B[0m');
}
} else {
stdout.writeln('No terminal detected');
}
}
我们检查终端是否存在、获取尺寸并测试 ANSI 转义码支持。这有助于创建适应不同环境的自适应控制台应用程序。
$ dart main.dart Terminal width: 80 Terminal height: 24 Red Text
同步与异步写入
此示例比较了同步和异步输出方法。
main.dart
import 'dart:io';
void main() async {
// Synchronous writing
stdout.write('Sync 1 ');
stdout.write('Sync 2 ');
// Asynchronous writing
await stdout.addStream(Stream.fromIterable([
'Async 1 '.codeUnits,
'Async 2 '.codeUnits
].expand((x) => x)));
stdout.writeln();
print('Done');
}
同步写入会立即执行,而使用 addStream() 的异步写入稍后完成。混合使用它们需要小心以保持输出顺序。
$ dart main.dart Sync 1 Sync 2 Async 1 Async 2 Done
最佳实践
- 缓冲: 需要立即输出时使用
flush() - 错误处理: 对于 CLI 应用,请检查
hasTerminal - 性能: 对于大量输出,优先批量写入
- ANSI 代码: 首先验证
supportsAnsiEscapes
来源
本教程涵盖了 Dart 的 Stdout 类,并提供了实用示例,展示了基本输出、字节写入、终端控制和异步操作。
作者
列出 所有 Dart 教程。