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