ZetCode

Dart WritePipe

最后修改于 2025 年 4 月 4 日

Dart 中的 WritePipe 类提供了一种高效向流写入数据的方法。它适用于处理 I/O 操作、网络通信和数据处理管道。

WritePipe 异步管理数据写入操作,确保高效的内存使用和正确的错误处理。它是 Dart 核心库的一部分。

基本定义

WritePipe 是一个用于将数据写入输出流的实用工具。它处理背压并提供写入不同数据类型的方法。

主要功能包括分块写入、错误处理和流管理。它特别适用于高效写入大量数据。

WritePipe 的基本用法

本示例展示了使用 WritePipe 向文件进行基本数据写入。

main.dart
import 'dart:io';

void main() async {
  final file = File('output.txt');
  final sink = file.openWrite();
  final pipe = WritePipe(sink);
  
  await pipe.write('Hello, World!');
  await pipe.close();
  
  print('Data written to file');
}

我们创建一个连接到文件接收器的 WritePipe,写入数据,然后关闭它。该管道处理所有异步操作和资源管理。

$ dart main.dart
Data written to file

写入多个块

本示例演示了使用 WritePipe 分多个块写入数据。

main.dart
import 'dart:io';

void main() async {
  final file = File('data.log');
  final sink = file.openWrite();
  final pipe = WritePipe(sink);
  
  for (var i = 0; i < 5; i++) {
    await pipe.write('Chunk $i\n');
    print('Wrote chunk $i');
  }
  
  await pipe.close();
  print('All chunks written');
}

我们以正确的顺序分多个块写入数据。WritePipe 确保每个写入操作在开始下一个之前完成。

$ dart main.dart
Wrote chunk 0
Wrote chunk 1
Wrote chunk 2
Wrote chunk 3
Wrote chunk 4
All chunks written

错误处理

本示例展示了 WritePipe 操作的正确错误处理。

main.dart
import 'dart:io';

void main() async {
  try {
    final file = File('/invalid/path/data.txt');
    final sink = file.openWrite();
    final pipe = WritePipe(sink);
    
    await pipe.write('Test data');
    await pipe.close();
  } catch (e) {
    print('Error occurred: $e');
  }
}

WritePipe 操作可能会抛出异常,应捕获和处理。本示例演示了文件操作的正确错误处理。

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

写入二进制数据

本示例演示了通过 WritePipe 写入二进制数据。

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

void main() async {
  final file = File('binary.dat');
  final sink = file.openWrite();
  final pipe = WritePipe(sink);
  
  final data = Uint8List.fromList([0, 1, 2, 3, 4, 5]);
  await pipe.write(data);
  
  await pipe.close();
  print('Binary data written');
}

我们创建一个带有二进制数据的 Uint8List,并通过管道写入。WritePipe 会自动处理二进制数据转换和流式传输。

$ dart main.dart
Binary data written

网络通信

本示例展示了如何将 WritePipe 用于网络套接字通信。

main.dart
import 'dart:io';

void main() async {
  final socket = await Socket.connect('example.com', 80);
  final pipe = WritePipe(socket);
  
  await pipe.write('GET / HTTP/1.1\r\n');
  await pipe.write('Host: example.com\r\n');
  await pipe.write('Connection: close\r\n\r\n');
  
  await pipe.close();
  print('HTTP request sent');
  
  socket.listen((data) {
    print(String.fromCharCodes(data).trim());
  });
}

我们连接到 Web 服务器并使用 WritePipe 发送 HTTP 请求。该管道确保请求行和标头的正确排序。

$ dart main.dart
HTTP request sent
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
...

最佳实践

来源

Dart WritePipe 文档

本教程介绍了 Dart 的 WritePipe 类,并提供了实际示例,展示了基本用法、网络通信、二进制数据处理和错误管理。

作者

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

列出 所有 Dart 教程