dart系列之:如丝滑般柔顺,操作文件和目录
文章目录
- 简介
- File
- 读取整个文件
- 以流的形式读取文件
- 随机访问
- 文件的写入
- 处理异常
- 总结
简介
文件操作是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/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
dart系列之:如丝滑般柔顺,操作文件和目录相关推荐
- 揭秘双11丝滑般剁手之路背后的网络监控技术
简介:本篇将重点介绍Hologres在阿里巴巴网络监控部门成功替换Druid的最佳实践,并助力双11实时网络监控大盘毫秒级响应. 概要:刚刚结束的2020天猫双11中,MaxCompute交互式分析( ...
- xp精简工具_Windows10你也可以精简优化,丝滑般极爽轻松做到,再也不卡了
Windows10大家也比较熟悉了,都在使用,有的喜欢有的厌恶,喜欢的肯定是非常熟练操作Windows10了,厌恶呢一般是不了解Windows10操作,不想去接触新生事物,Windows7都已经够用了 ...
- vue可视化拖拽组件模板_基于 Vue 丝滑般拖拽排序组件VueSlicksort
今天给大家分享一个功能超强的自由拖拽排序组件VueSlicksort. vue-slicksort 一款功能强大的可拖拽的vue.js组件.拥有丝滑般拖拽动画效果,支持水平/垂直/网格拖拽排序.还可以 ...
- ant vue 树形菜单横向显示_丝滑般 Vue 拖拽排序树形表格组件Vue-DragTreeTable
今天给小伙伴们分享一款纵享丝滑般体验的Vue拖拽树形表格DragTreeTable. vue-drag-tree-table 基于vue.js实现可拖拽排序的树形表格组件.支持拖拽排序.固定表头.拖拽 ...
- 让代码丝滑般跳转,rust-analyzer,你值得拥有
1 RLS触怒了我 我是一个专一的人,从学习Rust起就在vscode中使用rls作为跳转插件(主要原因其实是懒),如果不是今天它彻底触怒了我,恐怕我还会对它继续钟情下去. 事情的原委是这样的,今天下 ...
- 【使用篇】WebView 实现嵌套滑动,丝滑般实现吸顶效果,完美兼容 X5 webview
本文首发我的公众号徐公,收录于 Github·AndroidGuide,这里有 Android 进阶成长知识体系, 希望我们能够一起学习进步,关注公众号徐公,5 年中大厂程序员,一起建立核心竞争力 背 ...
- 深入浅出讲解丝滑般动画特效实现原理
作者丨哈哈将 个推安卓高级开发工程师 来源丨个推技术学院 (getuitech) 前言 APP开发市场已经告别"野蛮生长"时代,人们不再满足于APP外形创新,而将目光转向全方面的用 ...
- 打造一个丝滑般自动轮播无限循环Android库
作者:一包纯牛奶 链接: https://juejin.im/post/5d6bce24f265da03db0790d1 本文由作者授权发布. 这里我把作者两篇文章合体了,主要是为了在项目功能介绍的基 ...
- android 延时播放动画,HollyTransition: 让APP丝滑般流畅:深入解读Android过渡动画Transition. 共享元素动画、场景动画、过场动画、延时动画...
HollyTransition 零.导读 深入解读Android过渡动画Transition: 页面切换动画(过场动画) 共享元素动画 延时动画 场景动画 一.Transition前世今生 为了支持各 ...
最新文章
- java swt 画按钮_向表中添加按钮(java swt)
- Build Docker image of a Python Flask app【转载】
- c hello world_世界上最难的 5 种编程语言!C/C++竟不在其列,它们到底是谁?
- python学习-文件的读写操作
- [react] 同时引用这三个库react.js、react-dom.js和babel.js它们都有什么作用?
- Python3机器学习工具包基础复习
- 调查了9648位Go用户:吐槽最多的竟是官方文档!
- 移动端——论使用图片撑出模拟背景所带来的好处(主要解决图片之上是一些动态变化的内容,图片的效果难以使用程序来实现)...
- C++中对私有成员变量进行赋值
- Pandas深入浅出
- C# Access 读写数据库
- Axure RP最新授权码
- Word论文排版教程
- 马克思主义基本原理概论
- 106短信通道等6种常见短信通道介绍,你了解多少呢
- 游戏视频录制用什么软件?这2款软件,用过都说好
- verilog键盘输入示例代码及分析(摩尔型有限状态机)
- Goldsrc 地图 BSP 文件格式规范
- C++:引用类型(int )
- 社区医疗app-Ui设计