乐趣区

关于dart:dart系列之如丝滑般柔顺操作文件和目录

简介

文件操作是 IO 中十分常见的一种操作,那么对应 dart 语言来说,操作文件是不是很简略呢?实际上 dart 提供了两种读取文件的形式,一种是一次性全副读取,一种是将文件读取为流。

一次性读取的毛病是须要将文件内容一次性全副载入到内存中,如果遇到文件比拟大的状况,就会比拟难堪。所以还须要流式读取文件的形式。一起来看看 dart 中这两种文件的读取形式吧。

File

事实上 dart 中有很多中央都有 File 这个类,这里咱们要解说的 File 类是 dart:io 包中的。

读取整个文件

File 代表一个整体的文件, 他有三个构造函数,别离是:

factory File(String path) 

factory File.fromUri(Uri uri)

factory File.fromRawPath(Uint8List rawPath)

其中最罕用的就是第一个构造函数。

咱们能够这样来结构一个文件:

var file = File('file.txt');

有了文件之后,就能够调用 File 中的各种读取办法。

文件读取自身有两种模式,一种是文本,一种是二进制。

如果是文本文件,File 提供了 readAsString 的办法,将整个文件读取为字符串。

  Future<String> readAsString({Encoding encoding: utf8});

咱们能够这样应用:

 var stringContents = await file.readAsString();

另外,咱们还能够一行一行的对文件进行读取:

Future<List<String>> readAsLines({Encoding encoding: utf8});

后果返回的是一个 List,list 中示意文件每行的内容。

 var lines = await file.readAsLines();

下面两个办法是异步的办法,File 还提供了两个同步的办法:

String readAsStringSync({Encoding encoding: utf8});

List<String> readAsLinesSync({Encoding encoding: utf8});

如果文件是二进制,那么能够应用 readAsBytes 或者同步的办法 readAsBytesSync:

Future<Uint8List> readAsBytes();

Uint8List readAsBytesSync();

dart 中示意二进制有一个专门的类型叫做 Uint8List, 他实际上示意的是一个 int 的 List。

还是刚刚的文件,咱们看下怎么以二进制的模式进行读取:

var file = File('file.txt');
var contents = await file.readAsBytes();

以流的模式读取文件

下面咱们讲到的读取形式,都是一次性读取整个文件,毛病就是如果文件太大的话,可能造成内存空间的压力。

所以 File 为咱们提供了另外一种读取文件的办法,流的模式来读取文件.

相应的定义方法如下:

  Stream<List<int>> openRead([int? start, int? end]);

咱们看一个根本的应用:

import 'dart:io';
import 'dart:convert';

Future<void> main() async {var file = File('file.txt');
  Stream<List<int>> inputStream = file.openRead();

  var lines = utf8.decoder
      .bind(inputStream)
      .transform(const LineSplitter());
  try {await for (final line in lines) {print('Got ${line.length} characters from stream');
    }
    print('file is now closed');
  } catch (e) {print(e);
  }
}

随机拜访

个别状况下文件是程序拜访的,然而有时候咱们须要跳过某些后面的数据,间接跳转到指标地址,则须要对文件进行随机拜访。

dart 提供了 open 和 openSync 两个办法来进行随机文件读写:

  Future<RandomAccessFile> open({FileMode mode: FileMode.read});
  RandomAccessFile openSync({FileMode mode: FileMode.read});

RandomAccessFile 提供了对文件的随机读写办法。十分好用。

文件的写入

写入和文件读取一样,能够一次性写入或者取得一个写入句柄,而后再写入。

一次性写入的办法有四种,别离对应字符串和二进制:

 Future<File> writeAsBytes(List<int> bytes,
      {FileMode mode: FileMode.write, bool flush: false});

void writeAsBytesSync(List<int> bytes,
      {FileMode mode: FileMode.write, bool flush: false});

Future<File> writeAsString(String contents,
      {FileMode mode: FileMode.write,
      Encoding encoding: utf8,
      bool flush: false});

void writeAsStringSync(String contents,
      {FileMode mode: FileMode.write,
      Encoding encoding: utf8,
      bool flush: false});

句柄模式能够调用 openWrite 办法,返回一个 IOSink 对象,而后通过这个对象进行写入:

IOSink openWrite({FileMode mode: FileMode.write, Encoding encoding: utf8});
var logFile = File('log.txt');
var sink = logFile.openWrite();
sink.write('FILE ACCESSED ${DateTime.now()}\n');
await sink.flush();
await sink.close();

默认状况下写入是会笼罩整个文件的,然而能够通过上面的形式来更改写入模式:

var sink = logFile.openWrite(mode: FileMode.append);

解决异样

尽管 dart 中所有的异样都是运行时异样,然而和 java 一样,要想手动解决文件读写中的异样,则能够应用 try,catch:

Future<void> main() async {var config = File('config.txt');
  try {var contents = await config.readAsString();
    print(contents);
  } catch (e) {print(e);
  }
}

总结

以上就是 dart 中的文件操作了。

本文已收录于 http://www.flydean.com/23-dart-file/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!

退出移动版