Dart - IO

文章目录[x]
  1. 1:File和Directory
  2. 1.1:一次全部读取
  3. 1.2:作为bytes读取
  4. 1.3:处理异常
  5. 1.4:流文件内容
  6. 1.5:写入内容到文件中
  7. 1.6:列出目录中的文件和文件夹
  8. 1.7:其他常用方法
  9. 2:HTTP客户端和服务器
  10. 2.1:HTTP服务器
  11. 2.2:HTTP客户端

对非Web应用程序的文件,SocketHTTP和其他I/O支持。

注意:基于浏览器的应用程序不能使用此库。 只有服务器,命令行脚本和Flutter移动应用程序才能导入和使用dart:io。

该库可以处理文件,目录,Socket,进程,HTTP服务器和客户端等。 与输入和输出相关的许多操作都是异步的,并使用FuturesStreams处理,这两者都在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 APIawait 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将数据写入文件。 使用FileopenWrite()方法获取可以写入的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}");
    }
  }
}

其他常用方法

FileDirectory类包含其他功能:

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();
}
点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00