dart:io 库
为非 Web 应用程序提供文件、套接字、HTTP 等输入/输出支持。
重要:基于浏览器的应用程序无法使用此库。只有以下内容可以导入和使用 dart:io 库
- 服务器
- 命令行脚本
- Flutter 移动应用程序
- Flutter 桌面应用程序
此库允许您处理文件、目录、套接字、进程、HTTP 服务器和客户端等。许多与输入/输出相关的操作都是异步的,并使用 Future 或 Stream 处理,这两个都在 dart:async 库 中定义。
在您的代码中使用 dart:io 库
import 'dart:io';
有关 Dart 中 I/O 的简介,请参阅 dart:io 库之旅。
文件、目录和链接
File、Directory 或 Link 的实例分别代表原生文件系统中相应文件、目录或链接。
您可以通过这些类型的对象操作文件系统。例如,您可以重命名文件或目录
File myFile = File('myFile.txt');
myFile.rename('yourFile.txt').then((_) => print('file renamed'));
File、Directory 和 Link 类提供的方法很多都是异步的,并返回一个 Future。
FileSystemEntity
File、Directory 和 Link 都扩展了 FileSystemEntity。除了作为这些类的超类外,FileSystemEntity 还提供了一些用于处理路径的静态方法。
要获取有关路径的信息,您可以使用 FileSystemEntity 静态方法,如 FileSystemEntity.isDirectory、FileSystemEntity.isFile 和 FileSystemEntity.exists。由于文件系统访问涉及 I/O,这些方法是异步的,并返回一个 Future。
FileSystemEntity.isDirectory(myPath).then((isDir) {
if (isDir) {
print('$myPath is a directory');
} else {
print('$myPath is not a directory');
}
});
HttpServer 和 HttpClient
HttpClient 和 HttpServer 类提供了低级的 HTTP 功能。
考虑使用在包中找到的更友好且可组合的 API,而不是直接使用这些类。
对于 HTTP 客户端,请参阅 package:http
。
对于 HTTP 服务器,请参阅 在 dart.dev 上编写 HTTP 服务器。
进程
Process 类提供了一种在原生机器上运行进程的方法。例如,以下代码生成了一个进程,该进程递归列出 web
下的文件。
Process.start('ls', ['-R', 'web']).then((process) {
stdout.addStream(process.stdout);
stderr.addStream(process.stderr);
process.exitCode.then(print);
});
使用 Process.start 返回一个 Future,当进程启动时,该 Process 对象完成。这个 Process 对象允许您在进程运行时与之交互。使用 Process.run 返回一个 Future,当启动的进程终止时,该 ProcessResult 对象完成。这个 ProcessResult 对象收集进程的输出和退出码。
使用 Process.start 时,您需要读取 Process.stdout 和 Process.stderr 流中所有传入的数据,否则系统资源不会被释放。
WebSocket
WebSocket 类提供了对 WebSocket 协议的支持。这允许客户端和服务器应用程序之间进行全双工通信。
WebSocket服务器使用普通的HTTP服务器来接受WebSocket连接。初始握手是一个HTTP请求,然后升级为WebSocket连接。服务器使用WebSocketTransformer来升级请求,并监听返回的WebSocket上的数据。例如,这里有一个监听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."));
客户端使用WebSocket的WebSocket.connect方法和使用WebSocket协议的URI来连接WebSocket。客户端可以使用WebSocket的WebSocket.add方法写入数据。例如,
var socket = await WebSocket.connect('ws://127.0.0.1:4040/ws');
socket.add('Hello, World!');
查看websocket_sample应用程序,该程序使用WebSocket与服务器进行通信。
套接字和服务器套接字
客户端和服务器使用Socket通过TCP协议进行通信。服务器端使用ServerSocket,客户端使用Socket。服务器使用bind()
方法创建一个监听套接字,然后在该套接字上监听传入的连接。例如
ServerSocket.bind('127.0.0.1', 4041)
.then((serverSocket) {
serverSocket.listen((socket) {
socket.transform(utf8.decoder).listen(print);
});
});
客户端使用connect()
方法连接Socket,它返回一个Future。使用write()
、writeln()
或writeAll()
是发送数据的简单方法。例如
Socket.connect('127.0.0.1', 4041).then((socket) {
socket.write('Hello, World!');
});
除了Socket和ServerSocket之外,还有RawSocket和RawServerSocket类可用于对异步套接字IO进行低级访问。
标准输出、错误和输入流
此库提供了标准输出、错误和输入流,分别命名为stdout、stderr和stdin。
stdout和stderr流都是IOSink,具有相同的方法和属性集。
要将字符串写入stdout
stdout.writeln('Hello, World!');
要将对象列表写入stderr
stderr.writeAll([ 'That ', 'is ', 'an ', 'error.', '\n']);
标准输入流是一个真正的Stream,因此它继承了Stream类的属性和方法。
要从命令行同步读取文本(程序会阻塞,等待用户输入信息)
String? inputText = stdin.readLineSync();
类
- BytesBuilder
- 构建一个字节数组,允许在末尾添加字节数组和字节数组列表。
- CompressionOptions
- 控制WebSocket中压缩的选项。
-
ConnectionTask<
S> - 一个可取消的连接尝试。
- ContentType
- 用作HttpHeaders.contentTypeHeader头值的MIME/IANA媒体类型。
- Cookie
- cookie的表示。对于服务器作为Cookie头值接收的cookie,只有name和value属性将被设置。当在服务器中构建用于'set-cookie'头的cookie以及当客户端作为'set-cookie'头接收cookie时,可以使用所有字段。
- Datagram
- 由RawDatagramSocket接收的数据包。
- Directory
- 对文件系统上的目录(或文件夹)的引用。
- File
- 对文件系统上的文件的引用。
- FileLock
- 请求对文件加锁的类型。
- FileMode
- 文件可以打开的模式。
- FileStat
- 在文件系统对象上调用POSIX
stat()
函数的结果。 - FileSystemCreateEvent
- 文件系统事件,用于新创建的文件系统对象。
- FileSystemDeleteEvent
- 文件系统事件,用于删除文件系统对象。
- FileSystemEntity
- File、Directory 和 Link 的公共超类。
- FileSystemEntityType
- 文件系统实体(如文件、目录或链接)的类型。
- FileSystemEvent
- 由 FileSystemEntity.watch 发射的基事件类。
- FileSystemModifyEvent
- 文件系统事件,用于文件系统对象的修改。
- FileSystemMoveEvent
- 文件系统事件,用于文件系统对象的移动。
- GZipCodec
- GZipCodec 用于将原始字节编码为 GZip 压缩字节,并将 GZip 压缩字节解码为原始字节。
- HeaderValue
- 以以下形式表示头值:
- HttpClient
- 用于与 HTTP 服务器通信的 HTTP 客户端。
- HttpClientBasicCredentials
- 表示基本认证凭据。
- HttpClientCredentials
- HttpClientDigestCredentials
- 表示摘要认证凭据。摘要认证仅适用于使用 MD5 算法和“none”或“auth”质量保护(qop)的服务器。
- HttpClientRequest
- 客户端连接的 HTTP 请求。
- HttpClientResponse
- 客户端连接的 HTTP 响应。
- HttpConnectionInfo
- HttpRequest、HttpResponse、HttpClientRequest 或 HttpClientResponse 连接的信息。
- HttpConnectionsInfo
- 关于当前 HttpServer 的当前套接字连接的摘要统计信息。
- HttpDate
- 用于处理具有特定 HTTP 日期格式的日期的实用程序函数。
- HttpHeaders
- HTTP 请求和响应的头部。
- HttpOverrides
- 此类简化了使用模拟实现覆盖 HttpClient 的操作。它应在客户端代码中的另一个类中扩展,该类具有覆盖构建模拟实现的构造函数。此基类的实现默认为实际的 HttpClient 实现。例如
- HttpRequest
- 包含 HTTP 请求的内容和信息的服务器端对象。
- HttpResponse
- HTTP 响应,它返回服务器对 HTTP 请求的响应中的头和数据。
- HttpServer
- 使用 HTTP 协议提供内容的服务器。
- HttpSession
- HttpRequest 的 session。
- HttpStatus
- HTTP 状态代码。导出在 dart:io 和 dart:html。
- InternetAddress
- Internet 地址或 Unix 域地址。
- InternetAddressType
- InternetAddress 的类型或地址族。
- IOOverrides
- 覆盖
dart:io
的各种 API 的模拟实现设施。 - IOSink
- 一个结合了字节和文本输出的输出。
- Link
- 文件系统链接的引用。
- NetworkInterface
- NetworkInterface 表示当前系统上的活动网络接口。它包含绑定到接口的 InternetAddress 列表。
- Pipe
- 一个匿名管道,可用于单方向发送数据,即写入 write 的数据可以使用 read 读取。
- Platform
- 有关当前程序运行环境的信息。
- 进程
- 执行程序的方式。
- ProcessInfo
- 用于检索有关当前进程的信息的方法。
- ProcessResult
- 使用 Process.run 或 Process.runSync 启动的不交互式进程的结果。
- ProcessSignal
- 在Posix系统中,使用ProcessSignal发送特定信号到子进程,请参阅
Process.kill
。 - ProcessStartMode
- 运行新进程的模式。
- RandomAccessFile
- 对文件中的数据进行随机访问。
- RawDatagramSocket
- UDP套接字的非缓冲接口。
- RawSecureServerSocket
- 提供低级RawSecureSocket流的服务器套接字。
- RawSecureSocket
-
RawSecureSocket
提供安全的(SSL或TLS)网络连接。 - RawServerSocket
- 监听套接字。
- RawSocket
- TCP连接。
- RawSocketEvent
- 用于RawDatagramSocket、RawSecureSocket和RawSocket的事件。
- RawSocketOption
- RawSocketOption用作Socket.setRawOption和RawSocket.setRawOption的参数,以自定义底层套接字的行为。
- RawSynchronousSocket
- 一个用于通过TCP套接字同步通信的低级类。
- RawZLibFilter
- RawZLibFilter类提供对zlib的低级接口。
- ReadPipe
- 由Pipe.create创建的Pipe的“读取”端。
- RedirectInfo
- 重定向信息。
- ResourceHandle
- ResourceHandle是围绕OS资源句柄的包装,以便它可以作为SocketMessage的一部分通过套接字传递。
- SameSite
- Cookie跨站可用性配置。
- SecureServerSocket
- 提供高级Socket流的服务器套接字。
- SecureSocket
- 使用TLS和SSL的TCP套接字。
- SecurityContext
- 包含用于建立安全客户端连接时信任的证书的对象,以及从安全服务器提供的服务器证书链和私钥。
- ServerSocket
- 监听套接字。
- Socket
- 两个套接字之间的TCP连接。
- SocketControlMessage
- 是调用RawSocket.readMessage时接收到的SocketMessage的控制消息部分。
- SocketDirection
- SocketDirection用作Socket.close和RawSocket.close的参数,以关闭指定方向(s)的套接字。
- SocketMessage
- 由RawDatagramSocket接收的套接字消息。
- SocketOption
- 套接字的选项,它使用Socket.setOption进行配置。
- Stdin
- 进程的标准输入流。
- StdioType
- 标准IO流可以附加到的对象类型。
- Stdout
- 连接到进程的标准输出或错误的IOSink。
- SystemEncoding
- 系统编码在Windows上是当前代码页,在Linux和Mac上是UTF-8。
- TlsProtocolVersion
- 传输层安全性(TLS)版本。
- WebSocket
- 用于客户端或服务器应用程序的双向HTTP通信对象。
- WebSocketStatus
- 在关闭WebSocket连接时使用的WebSocket状态码。
- WebSocketTransformer
- WebSocketTransformer提供将HttpRequest升级到WebSocket连接的能力。它支持升级单个HttpRequest以及升级HttpRequest流。
- WritePipe
- 由Pipe.create创建的Pipe的“写入”端。
- X509Certificate
- X509Certificate表示SSL证书,并提供访问证书字段的访问器。
- ZLibCodec
- The ZLibCodec 将原始字节编码为 ZLib 压缩字节,并将 ZLib 压缩字节解码为原始字节。
- ZLibDecoder
- ZLibDecoder 由 ZLibCodec 和 GZipCodec 用于解压缩数据。
- ZLibEncoder
- ZLibEncoder 编码器由 ZLibCodec 和 GZipCodec 用于压缩数据。
- ZLibOption
- 公开 ZLib 选项作为输入参数。
枚举
- HttpClientResponseCompressionState
- 枚举,用于指定 HttpClientResponse 字节流的压缩状态。
常量
- gzip → const GZipCodec
- 默认 GZipCodec 实现的一个实例。
- systemEncoding → const SystemEncoding
- 当前系统编码。
- zlib → const ZLibCodec
- 默认 ZLibCodec 实现的一个实例。
属性
函数
类型别名
- BadCertificateCallback = bool Function(X509Certificate cr, String host, int port)
异常/错误
- CertificateException
- 在建立安全网络连接的握手阶段,查找或验证证书时发生的异常。
- FileSystemException
- 当文件操作失败时抛出的异常。
- HandshakeException
- 在建立安全网络连接握手阶段发生的异常。
- HttpException
- IOException
- 所有IO相关异常的基类。
- OSError
- 包含操作系统错误信息的异常。
- PathAccessException
- 当文件操作因必要的访问权限不可用而失败时抛出的异常。
- PathExistsException
- 当文件操作因目标路径已存在而失败时抛出的异常。
- PathNotFoundException
- 当文件操作因文件或目录不存在而失败时抛出的异常。
- ProcessException
- RedirectException
- SignalException
- SocketException
- 当套接字操作失败时抛出的异常。
- StdinException
- 由Stdin的一些操作抛出的异常。
- StdoutException
- 由Stdout的一些操作抛出的异常。
- TlsException
- 由TLS/SSL协议失败引起的安全网络异常。
- WebSocketException