- 1:File和Directory
- 1.1:一次全部读取
- 1.2:作为bytes读取
- 1.3:处理异常
- 1.4:流文件内容
- 1.5:写入内容到文件中
- 1.6:列出目录中的文件和文件夹
- 1.7:其他常用方法
- 2:HTTP客户端和服务器
- 2.1:HTTP服务器
- 2.2:HTTP客户端
对非Web应用程序的文件,Socket,HTTP和其他I/O支持。
注意:基于浏览器的应用程序不能使用此库。 只有服务器,命令行脚本和Flutter移动应用程序才能导入和使用dart:io。
该库可以处理文件,目录,Socket,进程,HTTP服务器和客户端等。 与输入和输出相关的许多操作都是异步的,并使用Futures或Streams处理,这两者都在dart:async库中定义。
要使用io库:
import 'dart:io';
File和Directory
通过I/O库,命令行应用程序可以读取和写入文件以及浏览文件目录。 有两种选择来读取文件的内容:一次全部读取或流式传输。 一次读取一个文件需要足够的内存来存储文件的所有内容。 如果文件很大,或者想在读取文件时对其进行处理,则应该使用流。
一次全部读取
读取使用UTF-8编码的文本文件时,可以使用readAsString()读取整个文件内容。 当各行都很重要时,可以使用readAsLines()。 在两种情况下,都将返回一个Future对象,该对象以一个或多个字符串的形式提供文件的内容。
Future<String> readAsString()async{
final file = File("./info.txt");
return await file.readAsString();
}
main(List<String> arguments) {
io.readAsString().then((str)=>print(str));
}
作为bytes读取
以下代码将整个文件作为字节读取到int集合中。 对readAsBytes()的调用返回一个Future,它在可用时提供结果。
Future<List<int>> readAsBytes()async{
final file = File("./info.txt");
return await file.readAsBytes();
}
main(List<String> arguments) {
io.readAsBytes().then((bytes)=> print('The file is ${bytes.length} bytes long.'));
}
处理异常
要捕获异常,可以在Future上注册catchError监听,或在异步函数中使用try-catch:
Future main() async {
var info = File('./info.txt');
try {
var contents = await info.readAsString();
print(contents);
} catch (e) {
print(e);
}
}
流文件内容
使用流一次读取文件。 可以使用Stream API或await for。
///[LineSplitter]将流转换为单独的行
void readAsStream()async{
final file = File("./info.txt");
final inputStream = file.openRead();
final lines = utf8.decoder.bind(inputStream).transform(LineSplitter());
await for (var line in lines){
print(line);
}
}
写入内容到文件中
可以使用IOSink将数据写入文件。 使用File的openWrite()方法获取可以写入的IOSink。 默认模式FileMode.write完全覆盖文件中的现有数据。
void writeContentToFile()async{
final file = File("./info2.txt");
final ioSink = file.openWrite();
ioSink.write("Time : ${DateTime.now()}");
await ioSink.flush();
await ioSink.close();
}
要将内容添加到文件的末尾,可以使用可选的mode参数指定FileMode.append:
var ioSink = file.openWrite(mode: FileMode.append);
要写入二进制数据,可以使用add(List <int> data)方法。
列出目录中的文件和文件夹
查找目录的所有文件和子目录是异步操作。 list()方法返回一个Stream,当遇到文件或目录时该Stream发出一个对象:
void listDir()async{
final dir = Directory("/");
Stream<FileSystemEntity> stream =dir.list();
await for(var item in stream){
if(item is File){
print("Find file:${item.path}");
}else if(item is Directory){
print("Find dir: ${item.path}");
}
}
}
其他常用方法
File和Directory类包含其他功能:
1、创建文件或目录:create()
2、删除文件或目录:delete()
3、获取文件的长度:length()
4、随机访问文件:open()
HTTP客户端和服务器
dart:io库提供了命令行应用程序可用于访问HTTP资源以及运行HTTP服务器的类。
HTTP服务器
HttpServer类提供用于构建Web服务器的低级功能。 可以匹配请求处理程序,设置标头,流数据等。
以下例子Web服务器返回简单文本信息。 该服务器监听端口8888和地址127.0.0.1,以响应对路径/dart的请求。 对于任何其他路径,响应为状态码404:
Future main() async {
final requests = await HttpServer.bind('localhost', 8888);
await for (var 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 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();
}