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: ñçá
最佳实践
- 务必关闭:确保接收器被正确关闭
- 使用 await:等待关闭/刷新操作
- 处理错误:为 I/O 操作实现错误处理
- 指定编码:处理文本时设置编码
- 考虑缓冲:策略性地使用 flush 进行大量写入
来源
本教程通过实际示例介绍了 Dart 的 IOSink 类,包括文件操作、标准输出写入、缓冲和错误处理。
作者
列出 所有 Dart 教程。