ZetCode

Dart Stdin

最后修改于 2025 年 4 月 4 日

Dart 中的 Stdin 类提供了从标准输入流(通常是控制台)读取输入的功能。它是 Dart 的 dart:io 库的一部分,对于控制台应用程序至关重要。

Stdin 提供同步和异步方法来读取输入。它可以读取字节、行或使用各种编码转换输入。

基本定义

Stdin 代表 Dart 进程的标准输入流。可以通过 dart:io 库的顶级函数的 stdin 属性访问它。

主要功能包括行读取、字节读取、编码支持和异步操作。它对于交互式控制台应用程序至关重要。

读取单行

本示例展示了如何从控制台读取单行文本。

main.dart
import 'dart:io';

void main() {
  stdout.write('Enter your name: ');
  String name = stdin.readLineSync() ?? 'Unknown';
  print('Hello, $name!');
}

我们使用 readLineSync() 同步读取一行。如果到达 EOF,该方法返回 null,因此我们提供一个默认值。stdout.write 在打印时不会添加换行符。

$ dart main.dart
Enter your name: John
Hello, John!

读取数字

本示例演示了读取和解析数字输入。

main.dart
import 'dart:io';

void main() {
  stdout.write('Enter first number: ');
  var num1 = int.tryParse(stdin.readLineSync() ?? '0') ?? 0;
  
  stdout.write('Enter second number: ');
  var num2 = int.tryParse(stdin.readLineSync() ?? '0') ?? 0;
  
  print('Sum: ${num1 + num2}');
}

我们读取字符串并将其转换为整数。tryParse 通过返回 null 来处理无效输入,因此我们提供一个备用值。这使得程序能够更稳健地处理错误输入。

$ dart main.dart
Enter first number: 12
Enter second number: 7
Sum: 19

异步读取行

本示例展示了如何异步读取输入。

main.dart
import 'dart:io';

Future<void> main() async {
  stdout.write('Enter your favorite color: ');
  var color = await stdin.readLine();
  
  stdout.write('Enter your age: ');
  var age = await stdin.readLine();
  
  print('$age-year-old who loves $color');
}

我们使用 readLine(),它返回一个 Future<String>await 关键字会暂停执行,直到收到输入。这种方法是非阻塞的,更适合复杂的应用程序。

$ dart main.dart
Enter your favorite color: blue
Enter your age: 25
25-year-old who loves blue

读取原始字节

本示例演示了从标准输入读取原始字节。

main.dart
import 'dart:io';

void main() {
  stdout.writeln('Press any key to continue...');
  var byte = stdin.readByteSync();
  print('You pressed: $byte (${String.fromCharCode(byte)})');
}

readByteSync() 从输入中读取单个字节。我们将字节转换为其字符表示。这对于低级输入处理或单键响应很有用。

$ dart main.dart
Press any key to continue...
a
You pressed: 97 (a)

读取直到 EOF

本示例展示了如何读取多行直到文件结束。

main.dart
import 'dart:io';

void main() {
  print('Enter multiple lines (Ctrl+D to end):');
  var lines = <String>[];
  
  while (true) {
    var line = stdin.readLineSync();
    if (line == null) break;
    lines.add(line);
  }
  
  print('You entered ${lines.length} lines:');
  lines.forEach(print);
}

我们在循环中读取行,直到 readLineSync() 返回 null(EOF)。收集的行存储在一个列表中。这种模式对于处理管道输入或多行用户输入很有用。

$ dart main.dart
Enter multiple lines (Ctrl+D to end):
hello
world
dart
You entered 3 lines:
hello
world
dart

最佳实践

来源

Dart Stdin 文档

本教程涵盖了 Dart 的 Stdin 类,并通过实际示例展示了基本的输入读取、数字解析、异步操作和字节级访问。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程