Dart的 IO 库包含了文件读写的相关类,它属于 Dart 语法标准的一部分,所以通过 Dart IO 库,无论是 Dart VM 下的脚本还是 Flutter,都是通过 Dart IO 库来操作文件的,不过和 Dart VM 相比,Flutter 有一个重要差异是文件系统路径不同,这是因为Dart VM 是运行在 PC 或服务器操作系统下,而 Flutter 是运行在移动操作系统中,他们的文件系统会有一些差异。
公司主营业务:成都网站设计、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出永和免费做网站回馈大家。
Android 和 iOS 的应用存储目录不同, PathProvider 插件提供了一种平台透明的方式来访问设备文件系统上的常用位置。该类当前支持访问两个文件系统位置:
File代表一个整体的文件,他有三个构造函数,分别是:
文件读取本身有两种形式,一种是文本,一种是二进制。
2.2.1 读取文本内容
如果是文本文件,File提供了readAsString、readAsLines、readAsStringSync、readAsLinesSync方法,读取文本内容
readAsString 一次性读取所有文本
readAsLines 一行行的读取文本
结果返回的是一个List,list中表示文件每行的内容
readAsStringSync、readAsLinesSync同步读取文本
2.2.2 读取二进制内容
如果文件是二进制,那么可以使用readAsBytes或者同步的方法readAsBytesSync:
dart中表示二进制有一个专门的类型叫做Uint8List,他实际上表示的是一个int的List。
上面提到的读取方式,都是一次性读取整个文件,缺点就是如果文件太大的话,可能造成内存空间的压力。
所以File为我们提供了另外一种读取文件的方法,流的形式来读取文件.
示例
dart提供了open和openSync两个方法来进行随机文件读写:
写入和文件读取一样,可以一次性写入或者获得一个写入句柄,然后再写入。
一次性写入的方法有四种,分别对应字符串和二进制
句柄形式可以调用openWrite方法,返回一个IOSink对象,然后通过这个对象进行写入:
默认情况下写入是会覆盖整个文件的,但是可以通过下面的方式来更改写入模式:
虽然dart中所有的异常都是运行时异常,但是和java一样,要想手动处理文件读写中的异常,则可以使用try,catch:
我们还是以计数器为例,实现在应用退出重启后可以恢复点击次数。 这里,我们使用文件来保存数据:
1.引入PathProvider插件;在pubspec.yaml文件中添加如下声明:
执行 flutter pub get
2.实现如下
参考:
官方文档
将 Flutter module 集成到 iOS 项目
(1)这时候还没有App.framework , podspec文件是有了
(2)有engine,Flutter.framework。
(3)有插件列表 podspec FlutterPluginRegistrant.podspec,这时没有symlinks/plugins目录软链接
(4)导出当前的环境变量 flutter_export_environment.sh
flutter-plugins-dependencies
执行 podHelper.rb 脚本
做2件事情:
/Volumes/huc/opt/fvm/versions/2.2.0/packages/flutter_tools/bin/xcode_backend.sh build
多了.symlinks 和App.framework,重新拷贝了Flutter.xcframework
Pods-HouseCommercialCube-frameworks.sh
执行 xcode_backend.sh
做3件事情:
AppFrameworkInfo.plist
assets_path 这个后面也没有人用啊!
放到.ios下面
.ios/Flutter/engine/Flutter.xcframework
编译前, 把这个下面添加一个空文件, engine被覆盖了,那么那个空文件就没了?
对比了一下大小。 release
debug 版本的Flutter.xcframework 255M
ios-release 1.03 GB
一开始是1.03G, run之后, 变成了255M
说明确实拷贝到这里了
.ios下面App.framework 没有变
App.framework 61Mb
Flutter.framework 35Mb
"${PODS_ROOT}/Target Support Files/Pods-HouseCommercialCube/Pods-HouseCommercialCube-frameworks.sh"
path_provider是flutter提供的一个获取应用存储路径的插件,它封装了统一的api来获取Android和ios两个平台的应用存储路径,提供的api如下:
getTemporaryDirectory():获取应用临时文件夹,该文件夹用来保存应用的缓存,可以随时删除用于清缓存,对应于Android的getCacheDir()和ios的NSTemporaryDirectory();
getApplicationDocumentsDirectory():获取应用安装路径,在应用被卸载的时候删除,对应Android的AppDate目录和iOS的NSDocumentDirectory目录;
getExternalStorageDirectory():获取存储卡目录,仅支持Android;
我们通过File和Directory来创建文件和文件夹时首先要获取到应用的相关路径,不然会报错;
File对象和Directory对象封装在dart:io中,使用时需要先引入该库:
Directory对象提供listSync()方法获取文件夹里的内容,该方法返回一个数组;
文件和文件夹都通过delete删除,delete异步,deleteSync同步;如果一个文件夹是非空的删除会报错,删除非空文件夹需要先清空该文件夹:
flutter对json序列化需要引入 dart:convert 库:
通过jsonEncode/jsonDecode来转换json对象:
// 将test目录下的info.json复制到test2目录下的info2.json中
引入包archive包:
压缩:
压缩前使用ZipFileEncoder先声明处理压缩的对象,调用该对象的zipDirectory方法压缩文件,该方法接受两个参数,第一个是要压缩文件/文件夹的路径,第二个是压缩包的保存路径;
解压:
当一个对象拷贝另一个对象的数据的时候,只要一个对象的数据发生改变另一个对象的数据也会发生改变,因为浅拷贝拷贝的是引用的地址
(所以必须在对象是多层才能拷贝,单层拷贝的是数值,多层说明里面套着对象,所以拷贝的是地址。)
当我们需要对数据进行修改等操作,同步改变源数据
当一个对象拷贝另一个对象的数据的时候,其中一个对象的数据发生变化不会影响另一个对象的数据,因为深考贝拷贝的是对象的数据而不是地址
对于一些复杂的数据类型,当我们需要对数据进行修改等操作,但是不改变源数据