▲Dart-‘dart:io’库
Posted itzyjr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了▲Dart-‘dart:io’库相关的知识,希望对你有一定的参考价值。
dart:io
- 服务器和命令应用程序的I/O。
dart:io库提供APIs处理文件(files)、目录(directories)、进程(processes)、套接字(sockets)、WebSocket以及HTTP客户端和服务器的API。
重要说明:
只有非web Flutter应用程序、命令行脚本和服务器才能导入和使用dart:io,而不是web应用程序。
通常,dart:io库实现并提升异步API。同步方法很容易阻塞应用程序,使其难以扩展。因此,大多数操作通过Future或Stream对象返回结果,这是现代服务器平台(如Node.js)中常见的模式。
dart:io库中的几个同步方法在方法名称上用Sync后缀清楚地标记。本章节不涵盖同步方法。
1. 文件和目录
I/O库使命令行应用程序能够读写文件和浏览目录。读取文件内容有两种选择:一次读取全部内容,或流式读取。一次读取一个文件需要足够的内存来存储该文件的所有内容。如果文件非常大,或者您希望在读取文件时对其进行处理,则应使用流,如Streaming file contents中所述。
- 将文件作为文本读取:
读取使用UTF-8编码的文本文件时,可以使用readAsString()
读取整个文件内容。当单独的行很重要时,可以使用readAsLines()
。在这两种情况下,都会返回一个Future对象,该对象以一个或多个字符串的形式提供文件的内容。
Future<void> main() async
var config = File('config.txt');
// Put the whole file in a single string.
var stringContents = await config.readAsString();
print('The file is $stringContents.length characters long.');
// Put each line of the file into its own string.
var lines = await config.readAsLines();
print('The file is $lines.length lines long.');
- 将文件作为二进制读取:
下面的代码将整个文件作为字节读取到整数列表中。对readAsBytes()
的调用返回一个Future,该函数在可用时提供结果。
Future<void> main() async
var config = File('config.txt');
var contents = await config.readAsBytes();
print('The file is $contents.length bytes long.');
- 错误处理:
要捕获错误,使其不会导致未捕获的异常,你可以在Future注册catchError处理程序,或者(在异步函数中)使用try-catch:
Future<void> main() async
var config = File('config.txt');
try
var contents = await config.readAsString();
print(contents);
catch (e)
print(e);
- 用Stream读取文件:
使用Stream读取文件,一次读取一点。你可以使用Stream API或await for。
import 'dart:io';
import 'dart:convert';
Future<void> main() async
var config = File('config.txt');
Stream<List<int>> inputStream = config.openRead();
var lines = utf8.decoder.bind(inputStream).transform(const LineSplitter());
try
await for (final line in lines)
print('Got $line.length characters from stream');
print('file is now closed');
catch (e)
print(e);
var logFile = File('log.txt');
var sink = logFile.openWrite();
sink.write('FILE ACCESSED $DateTime.now()\\n');
await sink.flush();
await sink.close();
将数据添加到文件末尾,可以把可选参数mode指定为FileMode.append:
var sink = logFile.openWrite(mode: FileMode.append);
添加二进制数据,使用add(List<int> data)
。
- 列出目录中的文件:
查找目录的所有文件和子目录是一项异步操作。方法返回遇到文件或目录时对象的Stream。
Future<void> main() async
var dir = Directory('tmp');
try
var dirList = dir.list();
await for (final FileSystemEntity f in dirList)
if (f is File)
print('Found file $f.path');
else if (f is Directory)
print('Found dir $f.path');
catch (e)
print(e.toString());
- 其他常用方法:
文件和目录类包含其他功能,包括但不限于:
- 创建一个文件或目录:create()(针对文件或目录)
- 删除一个文件或目录:delete()(针对文件或目录)
- 获取文件的长度:length()(针对文件)
- 获取对文件的随机访问:open()(针对文件)
2. HTTP客户端和服务器
dart:io库提供了命令行应用程序可用于访问HTTP资源以及运行HTTP服务器的类。
- HTTP服务器
HttpServer类提供构建web服务器的低级功能。你可以匹配请求处理程序、设置头、流数据等。
下面的示例web服务器返回简单的文本信息。此服务器侦听端口8888和地址127.0.0.1(本地主机),响应路径/dart请求。对于任何其他路径,响应为状态代码404(未找到页面)。
Future<void> main() async
final requests = await HttpServer.bind('localhost', 8888);
await for (final request in requests)
processRequest(request);
void processRequest(HttpRequest request)
print('Got request for $request.uri.path');
final response = request.response;
if (request.uri.path == '/dart')
response
..headers.contentType = ContentType('text','plain')
..write('Hello from the server');
else
response.statusCode = HttpStatus.notFound;
response.close();
- HTTP客户端:
HttpClient类帮助你从Dart命令行或服务器端应用程序连接到HTTP资源。你可以设置头、使用HTTP方法以及读写数据。HttpClient类在基于浏览器的应用程序中不起作用。在浏览器中编程时,请使用dart:html HttpRequest类。
一个使用HttpClient的示例:
Future<void> main() async
var url = Uri.parse('http://localhost:8888/dart');
var httpClient = HttpClient();
var request = await httpClient.getUrl(url);
var response = await request.close();
var data = await utf8.decoder.bind(response).toList();
print('Response $response.statusCode: $data');
httpClient.close();
3. 更多
本页展示了如何使用dart:io库的主要功能。除了本节讨论的API之外,dart:io库还为进程(processes)、套接字(sockets)和web sockets提供API。有关服务器端和命令行应用程序开发的更多信息,请参阅服务器端Dart概述。
以上是关于▲Dart-‘dart:io’库的主要内容,如果未能解决你的问题,请参考以下文章