Dart 读取文件
最后修改日期:2024 年 1 月 28 日
本文介绍如何在 Dart 语言中读取文件。我们读取文本文件和二进制文件。
dart:io
包用于执行 IO 操作,包括读取文件。File
类包含操作文件及其内容的方法。
可以使用 try/catch
关键字来处理可能的 IO 异常。
请注意,不应将 readAsString
和 readAsStringSync
用于读取大文件。
sky blue cup cloud water war pen dog
这是一个简单的文本文件。
Dart 使用 readAsString 读取文件
readAsString
方法使用指定的编码将整个文件内容读取为字符串。编码默认为 utf-8。它返回一个 Future<String>
,一旦文件内容被读取,该 Future 就会以字符串形式完成。
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
同步地将给定文件的内容读取到字符串中。
import 'dart:io'; void main() { var fileName = 'words.txt'; var contents = File(fileName).readAsStringSync(); print(contents); }
该示例使用 readAsStringSync
读取文本文件。
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。
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
语法。
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
同步地逐行读取文件。它返回一个字符串列表。
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
读取文件。
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)); }
我们使用 Stream
和 StringBuffer
读取文本文件。
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>
。
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 中读取文件。
作者
列出 所有 Dart 教程。