Flutter dart:io 库
你将得到什么?
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 操作文件、目录和连接
您可以通过这些类型的对象操作文件系统。例如,您可以重命名一个文件或目录:
File myFile = new File('我的文件.txt');
myFile.rename('新的文件名.txt').then((_) => print('文件被重命名'));
文件、目录和链接类提供的许多方法,他们都是异步运行的,最后返回一个Future。
FileSystemEntity
文件、目录和链接都是FileSystemEntity的扩展。除了作为这些类的超类之外,FileSystemEntity还有许多用于处理路径的静态方法。如“isDirectory”、“isFile”和“exists”等等,来获取文件相关的信息。
FileSystemEntity.isDirectory(myPath).then((isDir) {
if (isDir) {
print('$myPath 是目录');
} else {
print('$myPath 不是目录');
}
});
HttpServer 和 HttpClient
HttpServer 提供实现 HTTP 服务端的基本功能。
HttpServer 提供了 HttpRequest 对象的流。每个 HttpRequest 都对应一个 HttpResponse 对象。服务端通过写入 HttpResponse 对象来响应请求。下面代码示例展示如何将HttpServer 绑定到端口 80 上的 IPv6 因特网地址,以及如何侦听请求。
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 下的文件列表
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 流的所有数据,否则系统资源不会被释放。
// 列出当前目录下的所有文件
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."));
客户端连接示例
var socket = await WebSocket.connect('ws://127.0.0.1:4040/ws');
socket.add('Hello, World!');
调用 connect 方法连接到服务端的套接字服务,调用 add 方法往套接字内写入数据。
ServerSocket 和 Socket
客户端与服务端基于TCP协议进行通信的。服务端用 ServerSocket ,客户端用 Socket 。服务端的 ServerSocket 调用 bind 创建套接字,然后再监听访问进来的套接字请求。服务端示例:
ServerSocket.bind('127.0.0.1', 4041)
.then((serverSocket) {
serverSocket.listen((socket) {
socket.transform(utf8.decoder).listen(print);
});
});
客户端用 connect 方法建立套接字连接,也会返回一个Future。我们可以调用 write()
, writeln()
,或者 writeAll()
等方法通过套接字发送消息出去。客户端示例:
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();
一直监听等待用户输入信息。
总结
1、牵涉到异步操作的地方,都会返回Future对象。
2、简单介绍了dart:io,具体在使用时,应详细参考官方每节内容。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!