ZetCode

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

最佳实践

来源

Dart Stdout 文档

本教程涵盖了 Dart 的 Stdout 类,并提供了实用示例,展示了基本输出、字节写入、终端控制和异步操作。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程