ZetCode

Dart 写入文件

最后修改日期:2024 年 1 月 28 日

在本文中,我们将展示如何在 Dart 语言中写入文件。

dart:io 包用于执行 IO 操作,包括写入文件。File 类包含用于操作文件及其内容的方法。

Dart 提供了同步和异步方法用于写入文件,例如 writeAsStringSyncwriteAsString

openWrite 函数为文件创建一个新的独立 IOSink。当不再使用时,必须显式关闭它,以释放系统资源。

注意: 一次性将字符串或列表写入文件的使用方式不适用于大量数据。

Dart writeAsStringSync

writeAsStringSync 方法同步地将字符串写入文件。它会打开文件,以指定的编码写入字符串,然后关闭文件。

main.dart
import 'dart:io';

void main() {
  final fname = 'output.txt';
  final f = new File(fname);

  final data = 'an old falcon';
  f.writeAsStringSync(data);
}

在程序中,我们同步地将一个字符串写入文件。如果文件不存在,则会创建文件。如果文件已存在,则会被覆盖。

import 'dart:io';

我们导入 dart:io 库。

final fname = 'output.txt';
final f = new File(fname);

我们创建了一个新的 File 实例。

final data = 'an old falcon';
f.writeAsStringSync(data);

我们将字符串写入文件。

Dart writeAsString

writeAsString 函数打开文件,以指定的编码写入字符串,然后关闭文件。它返回一个 Future<File>,该 Future 在整个操作完成后会以文件对象完成。

main.dart
import 'dart:io';

void main() async {
  final fname = 'output2.txt';
  final f = new File(fname);

  final data = 'a stormy night';
  await f.writeAsString(data);
}

我们使用 writeAsString 函数将字符串写入文件。

void main() async {

由于我们使用了异步的 writeAsString 函数,因此必须在 main 函数声明中添加 async 关键字。

await f.writeAsString(data);

使用 await 关键字,我们可以获取异步操作的完成结果。

Dart writeAsBytesSync

writeAsBytesSync 成员函数同步地将字节列表写入文件。

main.dart
import 'dart:io';

void main() {
  final fname = 'bytes.txt';

  final text = "one 🐘 and three 🐋";
  final data = utf8.encode(text);
  final f = new File(fname);

  f.writeAsBytesSync(data);
}

在示例中,我们使用 writeAsBytesSync 将带有表情符号的文本消息写入文件。

final text = "one 🐘 and three 🐋";

我们有包含两个表情符号的文本。

final data = utf8.encode(text);

我们将文本编码为整数列表。

f.writeAsBytesSync(data);

编码后的文本被同步写入文件。

$ dart main.dart 
$ cat bytes.txt
one 🐘 and three 🐋

Dart 获取图片

在下一个示例中,我们将从 URL 资源获取图片。

main.dart
import 'dart:io';
import 'package:http/http.dart' as http;

void main() async {
  final res = await http.get(Uri.http('webcode.me', '/favicon.ico'));
  final bdata = res.bodyBytes;

  final fname = 'favicon.ico';
  final f = await File(fname);
  await f.writeAsBytes(bdata);
}

该示例下载了一个小的 favicon。

import 'package:http/http.dart' as http;

要创建 HTTP GET 请求,我们使用 http 库。

final bdata = res.bodyBytes;

使用 bodyBytes,我们检索响应体中的字节。

final fname = 'favicon.ico';
final f = await File(fname);

我们创建 File 对象。

await f.writeAsBytes(bdata);

字节被写入文件。

Dart 追加到文件

在下一个示例中,我们将数据追加到文件。

main.dart
import 'dart:io';

void main() async {
  final fname = 'words.txt';

  final words = ['cloud', 'blue', 'book', 'solid'];
  final f = new File(fname);

  for (final word in words) {
    await f.writeAsString('$word\n', mode: FileMode.append);
  }
}

要将数据追加到文件,我们使用 FileMode.append 模式。

Dart IOSink 写入

IOSinkwrite 方法将一个对象写入 sink。

main.dart
import 'dart:io';

void main() {
  final fname = 'test.txt';

  final f = File(fname);
  final sink = f.openWrite();
  sink.write('current datetime: ${DateTime.now()}\n');

  sink.close();
}

该示例将当前日期时间写入 sink。

final sink = f.openWrite();

File 对象,我们使用 openWrite 方法打开 sink。

sink.write('current datetime: ${DateTime.now()}\n');

数据通过 write 写入 sink。

sink.close();

我们关闭 IOSink 以释放系统资源。

Dart IOSink writeAll

IOSinkwriteAll 函数会遍历给定的对象并将它们按顺序写入。

main.dart
import 'dart:io';

void main() {
  final fname = 'words2.txt';

  final words = ['sky', 'ocean', 'pen', 'rock', 'storm', 'falcon'];

  final f = File(fname);
  final sink = f.openWrite();
  sink.writeAll(words, "\n");

  sink.close();
}

在示例中,我们使用 writeAll 将列表的内容写入 sink。

来源

Dart I/O 文档

在本文中,我们展示了如何在 Dart 中写入文件。

作者

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

列出 所有 Dart 教程