ZetCode

Dart IOSink

最后修改于 2025 年 4 月 4 日

Dart 中的 IOSink 类提供了一个基于流的接口来执行 I/O 操作。它通常用于写入文件、套接字和其他面向字节的接收器。

IOSink 实现了 StreamSink 接口,并提供了同步和异步写入的方法。它是 Dart 核心 dart:io 库的一部分。

基本定义

IOSink 是一个抽象类,代表字节数据的目标。它提供了写入数据和管理输出流的方法。

主要功能包括缓冲写入、编码支持和流控制。它在 Dart 应用程序中与文件、标准输出和网络套接字一起使用。

基本的 IOSink 用法

此示例展示了使用 IOSink 进行基本的文件写入。

main.dart
import 'dart:io';

void main() async {
  var file = File('output.txt');
  var sink = file.openWrite();
  
  sink.write('Hello, ');
  sink.writeln('Dart!');
  
  await sink.close();
  print('File written successfully');
}

我们创建一个文件接收器,向其写入文本,并正确关闭资源。openWrite 方法返回一个用于文件操作的 IOSink。

$ dart main.dart
File written successfully

写入不同的数据类型

此示例演示了向接收器写入各种数据类型。

main.dart
import 'dart:io';

void main() async {
  var sink = stdout;
  
  sink.write('String: ');
  sink.writeln('Dart');
  
  sink.write('Integer: ');
  sink.writeln(42);
  
  sink.write('Double: ');
  sink.writeln(3.14);
  
  sink.write('Boolean: ');
  sink.writeln(true);
  
  await sink.flush();
}

IOSink 提供了写入不同数据类型的方法,并自动转换为字符串。在本例中,我们使用标准输出来作为接收器。

$ dart main.dart
String: Dart
Integer: 42
Double: 3.14
Boolean: true

缓冲写入

此示例展示了 IOSink 如何处理缓冲写入。

main.dart
import 'dart:io';

void main() async {
  var file = File('buffered.txt');
  var sink = file.openWrite();
  
  for (var i = 1; i <= 10; i++) {
    sink.write('Line $i\n');
    if (i % 5 == 0) {
      await sink.flush();
      print('Flushed at line $i');
    }
  }
  
  await sink.close();
}

接收器会缓冲写入以提高效率。我们每 5 行手动刷新一次以演示缓冲区控制。通常,关闭接收器会自动刷新。

$ dart main.dart
Flushed at line 5
Flushed at line 10

错误处理

此示例演示了使用 IOSink 进行正确的错误处理。

main.dart
import 'dart:io';

void main() async {
  var sink = File('nonexistent/path/output.txt').openWrite();
  
  try {
    sink.write('Test data');
    await sink.close();
  } on IOException catch (e) {
    print('Error writing file: $e');
    await sink.close();
  }
}

我们处理写入文件时可能发生的 I/O 错误。在成功和错误情况下都会正确关闭接收器,以防止资源泄露。

$ dart main.dart
Error writing file: FileSystemException: Cannot open file, path = 'nonexistent/path/output.txt' (OS Error: No such file or directory, errno = 2)

结合编码使用

此示例展示了在写入时如何指定字符编码。

main.dart
import 'dart:io';
import 'dart:convert';

void main() async {
  var file = File('encoded.txt');
  var sink = file.openWrite(encoding: latin1);
  
  sink.write('Special chars: ñçá');
  await sink.close();
  
  var content = await file.readAsString(encoding: latin1);
  print(content);
}

我们在创建接收器时指定 Latin-1 编码,以正确处理特殊字符。在读回文件时也使用相同的编码。

$ dart main.dart
Special chars: ñçá

最佳实践

来源

Dart IOSink 文档

本教程通过实际示例介绍了 Dart 的 IOSink 类,包括文件操作、标准输出写入、缓冲和错误处理。

作者

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

列出 所有 Dart 教程