▲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中所述。

  1. 将文件作为文本读取:
    读取使用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.');

  1. 将文件作为二进制读取:
    下面的代码将整个文件作为字节读取到整数列表中。对readAsBytes()的调用返回一个Future,该函数在可用时提供结果。
Future<void> main() async 
  var config = File('config.txt');
  var contents = await config.readAsBytes();
  print('The file is $contents.length bytes long.');

  1. 错误处理:
    要捕获错误,使其不会导致未捕获的异常,你可以在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);
  

  1. 用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);
  

  1. 写文件:
    您可以使用IOSink将数据写入文件。使用File openWrite()方法获取可以写入的iosink。默认模式(mode)为FileMode.write,完全覆盖文件中的现有数据。
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)

  1. 列出目录中的文件:
    查找目录的所有文件和子目录是一项异步操作。方法返回遇到文件或目录时对象的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());
  

  1. 其他常用方法:
    文件和目录类包含其他功能,包括但不限于:
  • 创建一个文件或目录:create()(针对文件或目录)
  • 删除一个文件或目录:delete()(针对文件或目录)
  • 获取文件的长度:length()(针对文件)
  • 获取对文件的随机访问:open()(针对文件)

获取全部方法,参考FileDirectory

2. HTTP客户端和服务器

dart:io库提供了命令行应用程序可用于访问HTTP资源以及运行HTTP服务器的类。

  1. 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();

  1. 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’库的主要内容,如果未能解决你的问题,请参考以下文章

dart:io 或 dart:html 的条件导入

Dart 包的条件导入/代码

Flutter Web:不使用 dart:io 裁剪图像

Flutter - 网络请求与 json 解析

dart:io 同步与异步文件操作

Flutter在启动前读取文件