简介
文件操作是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/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!