Flutter dart:io 库

奇技指南

本文是Flutter系列第四篇文章,阅读本文

你将得到什么:

1、dart:io 是什么?

2、dart:io 使用

3、dart:io 组成部分

4、dart:io 总结

本文来自奇舞移动技术

dart:io 是什么

dart:io 支持对非web应用程序的文件、套接字、HTTP 和其他 I/O 操作。换句话说,不支持基于浏览器的应用程序。只有服务器、命令行脚本和Flutter移动应用程序,才能导入和使用 dart:io 库。

基于 dart:io 我们可以处理文件、目录、套接字、进程、HTTP 服务器和客户端。使用 Futures 或 Streams 来处理异步的输入和输出相关操作。异步都在 dart:async 库中定义

dart:io 使用

在使用这个库时,将其导入,代码如下:

import 'dart:io';

dart:io 操作文件、目录和连接

您可以通过这些类型的对象操作文件系统。例如,您可以重命名一个文件或目录:

  1. File myFile = new File('我的文件.txt');	
    myFile.rename('新的文件名.txt').then((_) => print('文件被重命名'))

文件、目录和链接类提供的许多方法,他们都是异步运行的,最后返回一个Future。

FileSystemEntity

文件、目录和链接都是FileSystemEntity的扩展。除了作为这些类的超类之外,FileSystemEntity还有许多用于处理路径的静态方法。如 "isDirectory"、"isFile" 和 "exists" 等等,来获取文件相关的信息。

  1. FileSystemEntity.isDirectory(myPath).then((isDir) {	
      if (isDir) {	
        print('$myPath 是目录');	
      } else {	
        print('$myPath 不是目录');	
      }	
    });

HttpServer 和 HttpClient

HttpServer 提供实现 HTTP 服务端的基本功能。

HttpServer 提供了 HttpRequest 对象的流。每个 HttpRequest 都对应一个 HttpResponse 对象。服务端通过写入 HttpResponse 对象来响应请求。下面代码示例展示如何将HttpServer 绑定到端口 80 上的 IPv6 因特网地址,以及如何侦听请求。

  1. import 'dart:io';	
    
    	
    
    	
    main() {	
      HttpServer.bind(InternetAddress.anyIPv6, 80)	
          .then((server) {	
            server.listen((HttpRequest request) {	
              request.response.write('Hello, world!');	
              request.response.close();	
            });	
          });	
    }

对于一些更高级的构建模块,建议尝试一下用于 Dar 的 Web 服务器中间件 shelf 包 ,它包含一组高级类,以及这个库中的 HttpServer 类,更容易实现 HTTP 服务器业务。

HttpClient 提供客户端的基本功能。

HttpClient client = new HttpClient();	
client.getUrl(Uri.parse("http://www.example.com/"))	
    .then((HttpClientRequest request) {	
     // 可选地设置标题…	
     // 可选地写入请求对象…	
     // 然后调用关闭	
      return request.close();	
    })	
    .then((HttpClientResponse response) {	
      // 处理响应逻辑	
      ...	
    });

Process

Process 类提供了运行进程的方法。

例如,下面的代码生成一个进程,递归列出 web 下的文件列表

  1. Process.start('ls', ['-R', 'web']).then((process) {	
      stdout.addStream(process.stdout);	
      stderr.addStream(process.stderr);	
      process.exitCode.then(print);	
    });

调用 start() 方法时返回一个 Future 对象。在运行时,我们是可以操作当前的process,达到想要的目的。另外需要注意在使用 start( ) 时,必须读取 stdout 和 stderr 流的所有数据,否则系统资源不会被释放。

  1. // 列出当前目录下的所有文件	
    Process.run('ls', ['-l']).then((ProcessResult results) {	
      print(results.stdout);	
    });

调用 run 方法时,它将以 ProcessResult 对象结束当前进程。run方法不返回进程对象,这的话,我们的代码就不能与当前的process进行交互。

WebSocket

WebSocket 提供了 web 套接字协议,它支持客户端与服务端的应用程序之间进行全双工通信。web 套接字服务端使用普通 HTTP 来接受套接字连接。初始握手是一个 HTTP 请求,然后升级为 web 套接字连接。服务端使用 WebSocketTransformer 升级请求,并侦听返回的 web 套接字上的数据。例如,这里有一个服务端监听 WebSocket 上的 “ws” 数据:

runZoned(() async {	
  var server = await HttpServer.bind('127.0.0.1', 4040);	
  server.listen((HttpRequest req) async {	
    if (req.uri.path == '/ws') {	
      var socket = await WebSocketTransformer.upgrade(req);	
      socket.listen(handleMsg);	
    }	
  });	
}, onError: (e) => print("An error occurred."));

客户端连接示例

  1. var socket = await WebSocket.connect('ws://127.0.0.1:4040/ws');	
    socket.add('Hello, World!');

调用 connect 方法连接到服务端的套接字服务,调用 add 方法往套接字内写入数据。

ServerSocket 和 Socket

ServerSocket 和 Socket

客户端与服务端基于TCP协议进行通信的。服务端用 ServerSocket ,客户端用 Socket 。服务端的 ServerSocket 调用 bind 创建套接字,然后再监听访问进来的套接字请求。服务端示例:

  1. ServerSocket.bind('127.0.0.1', 4041)	
      .then((serverSocket) {	
        serverSocket.listen((socket) {	
          socket.transform(utf8.decoder).listen(print);	
        });	
      });

客户端用 connect 方法建立套接字连接,也会返回一个Future。我们可以调用 write(), writeln(),或者 writeAll() 等方法通过套接字发送消息出去。客户端示例:

  1. Socket.connect('127.0.0.1', 4041).then((socket) {	
      socket.write('Hello, World!');	
    });

除了 Socket 和 ServerSocket 之外,RawSocket 和 RawServerSocket 也可用于对异步套接字 IO 的低级访问。

RawSocket 是 TCP 套接字的非缓冲接口。它以与底层操作系统相同的块传输数据流。它不同与POSIX 原始套接字,感兴趣可以异步这里了解。

标准的输出、错误、输入流

dart:io 库提供了标准的输出、错误和输入流,分别名为 stdout、 stderr和 stdin。

stdout 和 stderr 都是从 IOSinks 继承属性和方法。

stdout 写入字符串:

stdout.writeln (“Hello, World !”);

stderr 写入对象列表:

stderr.writeAll([ 'That ', 'is ', 'an ', 'error.', '\n']);

stdin 是从 Stream 类 继承属性和方法。

示例命令行同步读取文本:

String inputText = stdin.readLineSync();

一直监听等待用户输入信息。

dart:io 是什么

1、牵涉到异步操作的地方,都会返回Future对象。

2、简单介绍了dart:io,具体在使用时,应详细参考官方每节内容。

相关推荐

最新活动

随着运维工作从规模和复杂度多方面的爆炸式增长,传统的运维手段已经无法满足如今业务系统运维管理的需求。AI 技术日趋成熟,智能运维(AIOps)应运而生,给运维行业带来了很多的变革和机会,并逐渐成为一种新的发展趋势。

640?wx_fmt=png
精彩内容都在
3 60互联网技术训练营第18期——AIOps落地实践探索

识别下方二维码或点击阅读原文,立即报名

640?wx_fmt=jpeg

界世的你当不

只做你的肩膀

640?wx_fmt=jpeg

 360官方技术公众号 

技术干货|一手资讯|精彩活动

空·

 点一下阅读原文了解更多资讯哦

640?wx_fmt=png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值