ZetCode

Dart 读取文件

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

本文介绍如何在 Dart 语言中读取文件。我们读取文本文件和二进制文件。

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

可以使用 try/catch 关键字来处理可能的 IO 异常。

请注意,不应将 readAsStringreadAsStringSync 用于读取大文件。

words.txt
sky
blue
cup
cloud
water
war 
pen
dog

这是一个简单的文本文件。

Dart 使用 readAsString 读取文件

readAsString 方法使用指定的编码将整个文件内容读取为字符串。编码默认为 utf-8。它返回一个 Future<String>,一旦文件内容被读取,该 Future 就会以字符串形式完成。

main.dart
import 'dart:io';

void main() async {
  var path = 'words.txt';

  try {
    var file = File(path);

    var contents = await file.readAsString();

    print(contents);
  } catch (e) {
    stderr.writeln('failed to read file: \n${e}');
  }
}

在示例中,我们使用 readAsString 读取一个文本文件。我们使用 try/catch 关键字显式处理异常。

import 'dart:io';

我们导入 dart:io 包。

var file = File(path);

创建一个 File 对象。

var contents = await file.readAsString();

我们使用 readAsString 方法读取文件内容。使用 await,我们等待异步操作完成。

$ dart main.dart 
sky
blue
cup
cloud
water
war 
pen
dog

Dart 使用 readAsStringSync 读取文件

readAsStringSync 同步地将给定文件的内容读取到字符串中。

main.dart
import 'dart:io';

void main() {
  var fileName = 'words.txt';
  var contents = File(fileName).readAsStringSync();
  print(contents);
}

该示例使用 readAsStringSync 读取文本文件。

Dart 自我读取文件

下一个程序读取其自身的内容。

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

void main() async {
  var file = File(Platform.script.toFilePath());
  print(await (file.readAsString(encoding: ascii)));
}

我们使用 Platform.script.toFilePath 确定程序文件名,然后使用 readAsString 读取内容。

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

void main() async {
  var file = File(Platform.script.toFilePath());
  print(await (file.readAsString(encoding: ascii)));
}

Dart 使用 readAsLines 读取文件

使用 readAsLines,我们逐行异步读取文件。该方法返回一个解析为字符串列表的 Future。

main.dart
import 'dart:io';

void main() {
  var fileName = 'words.txt';

  var myFile = new File(fileName);

  myFile.readAsLines().then((lines) => lines.forEach((line) => print(line)));
}

该示例逐行异步读取文本文件。

myFile.readAsLines().then((lines) => lines.forEach((line) => print(line)));

在这里,我们使用回调函数来处理行。

在下一个示例中,我们使用 async/await 语法。

main.dart
import 'dart:io';

void main() async {
  var fileName = 'words.txt';

  var myFile = new File(fileName);
  var lines = await myFile.readAsLines();

  lines.forEach((line) {
    print(line);
  });
}

程序使用 readAsLines 读取文件;它使用 async/await 语法。

Dart 使用 readAsLinesSync 读取文件

readAsLinesSync 同步地逐行读取文件。它返回一个字符串列表。

main.dart
import 'dart:io';

void main() {
  var fileName = 'words.txt';

  var myFile = new File(fileName);
  List<String> lines = myFile.readAsLinesSync();
  lines.forEach((line) => print(line));
}

该程序以同步方式逐行读取文本文件。

Dart 使用 Stream 读取文件

下一个程序使用 Stream 读取文件。

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

void main() {
  var fileName = 'words.txt';
  Stream<List<int>> stream = new File(fileName).openRead();
  StringBuffer buffer = new StringBuffer();

  stream.transform(utf8.decoder).transform(LineSplitter()).listen((line) {
    buffer.writeln("${line}");
  }, onDone: () => print(buffer.toString()), onError: (e) => print(e));
}

我们使用 StreamStringBuffer 读取文本文件。

Stream<List<int>> stream = new File(fileName).openRead();

我们使用 openRead 打开一个流。

StringBuffer buffer = new StringBuffer();

我们将数据写入 StringBuffer

stream.transform(utf8.decoder).transform(LineSplitter()).listen((line) {
    buffer.writeln("${line}");
    }, onDone: () => print(buffer.toString()), onError: (e) => print(e));

我们使用解码器和行分隔符转换流。最后一行被写入缓冲区。最后,缓冲区被打印到控制台。

Dart 读取二进制文件

readAsBytes 方法将整个文件内容读取为字节列表。它返回一个 Future<Uint8List>

main.dart
import 'dart:convert';
import 'dart:io';
import 'package:collection/collection.dart';

void main() async {
  var fileName = 'favicon.ico';
  var bytes = await File(fileName).readAsBytes();

  String base64Image = base64.encode(bytes);
  print(base64Image);

  var output = bytes
      .mapIndexed((idx, e) => e.toRadixString(16).padLeft(2, '0'))
      .join(' ');
  print(output);
}

在程序中,我们读取了一个小的 favicon 文件。

var bytes = await File(fileName).readAsBytes();

我们将文件读取到字节列表中。

String base64Image = base64.encode(bytes);

我们将字节编码为 base64 编码。

var output = bytes
    .mapIndexed((idx, e) => e.toRadixString(16).padLeft(2, '0'))
    .join(' ');

或者,我们将字节转换为十六进制数字。

来源

Dart I/O 文档

在本文中,我们展示了如何在 Dart 中读取文件。

作者

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

列出 所有 Dart 教程