flutter:文件系统目录、文件读写
参考
参考:老孟 文件存储和网络请求
数据存储
Dart的 IO 库包含了文件读写的相关类,它属于 Dart 语法标准的一部分,所以通过 Dart IO 库,无论是 Dart VM 下的脚本还是 Flutter,都是通过 Dart IO 库来操作文件的。但是不同的平台对应的文件系统是不同的,比如文件路径,因此通常使用Google 官方维护的插件 path_provider。
安装
在项目的 pubspec.yaml
文件中添加依赖
dependencies:path_provider: ^2.0.11
安装
flutter pub get
常用方法
getTemporaryDirectory
临时目录,适用于下载的缓存文件,此目录随时可以清除,此目录为应用程序私有目录,其他应用程序无法访问此目录。
getApplicationSupportDirectory
获取应用程序的支持目录。这个函数返回一个Future<Directory>
对象,表示应用程序的支持目录。
getLibraryDirectory
返回应用程序的库目录。这个目录通常用于存储应用程序的共享库或插件。
getApplicationDocumentsDirectory
应用程序的文档目录。文档目录是应用程序可以使用的持久性存储空间,通常用于存储用户生成的文件或其他数据。
getExternalStorageDirectory
应用程序可以访问顶级存储的目录的路径。由于此功能仅在Android上可用,因此应在发出此函数调用之前确定当前操作系统。
getExternalCacheDirectories
存储特定于应用程序的外部缓存数据的目录的路径。
getDownloadsDirectory
存储下载文件的目录的路径,这通常仅与台式机操作系统有关。 在Android和iOS上,此函数将引发[UnsupportedError]异常。
方法使用场景
下面从 Android 和 iOS 平台的角度介绍其文件路径,最后给出路径使用的建议以及使用过程中需要注意的事项。
安卓文件存储
Android 文件存储分为内部存储和外部存储。
内部存储:
- 其他应用无法访问这些数据
- 当应用卸载的时候,这些数据也会被删除,避免垃圾文件
- 不需要申请额外权限
- 存储的空间有限,此目录数据随时可能被系统清除,也可以通过 设置 中的 清除数据 可以清除此目录数据。
内部存储目录结构:
- cache 目录:对应 getTemporaryDirectory 方法,用于缓存文件,此目录随时可能被系统清除。
- files 目录:对应 getApplicationSupportDirectory 方法。
- code_cache:此目录存储 Flutter 相关代码和资源
- shared_prefs:SharePreferences(轻量级的本地存储) 的默认路径
- app_flutter:对应 getApplicationDocumentsDirectory方法。
- app_flutter/dbName:使用 sqlite(轻量级的关系型数据库,用于本地存储和管理应用程序的数据) 的默认路径,sqlite 也可以指定位置。
外部存储
- 当应用卸载的时候,这些数据也会被删除,避免垃圾文件
- 不需要申请额外权限
- 空间大且不会被系统清除,通过 设置 中的 清除数据 可以清除此目录数据。
- 用户可以直接对文件进行删除、导入操作。
外部存储目录结构
- cache:缓存目录,对应 getExternalCacheDirectories 方法。
- files:对应 getExternalStorageDirectories 方法。
苹果文件存储
iOS 文件存储相比 Android 要简单的多,因为 iOS 对用户隐私保护非常严格,每个 iOS 应用程序都有一个单独的文件系统,而且只能在对应的文件系统中进行操作,此区域被称为沙盒。
每个应用沙盒含有3个文件夹:Documents, Library 和 tmp:
- Documents:应用程序数据文件写入到这个目录下。这个目录用于存储用户数据。保存应用程序的重要数据文件和用户数据文件等。对应 getApplicationDocumentsDirectory 方法。
- Library:对应 getLibraryDirectory 方法
- tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能,按照官方说法每三天清理一次缓存数据。
总结
- SharePreferences 和 sqlite 数据建议存放在内部存储,插件已经帮我们完成了,无需手动处理。
- 严格保密的数据,比如用户数据,建议存放在内部存储,对应 getApplicationSupportDirectory 方法。
- 其余所有的数据建议存放
Android/data/包名/
,对应 getExternalCacheDirectories 和 getExternalStorageDirectories 方法。
基本使用
flutter官方示例
文件读写
文件夹
创建文件夹
ElevatedButton(onPressed: () async{// 获取应用程序目录Directory appDocumentDriectory = await getApplicationDocumentsDirectory();// 路径,Platform.pathSeparator 平台下的路径分隔符String path = '${appDocumentDriectory.path}${Platform.pathSeparator}myAppName';// 读取对应路径下的文件夹var dir = Directory(path);if(dir.existsSync()){print("当前文件夹已存在");}else{// 创建文件,可选参数recursive:true表示可以创建嵌套文件夹,false表示只能创建最后一级文件夹(上一级文件不存在会报错),默认falsevar result = await dir.create(recursive: true);print("文件创建成功:${result}");}}, child: const Text("创建文件夹"));
遍历文件夹
ElevatedButton(onPressed: () async{// 获取应用程序目录Directory appDocumentDirectory = await getApplicationDocumentsDirectory();String path = '${appDocumentDirectory.path}${Platform.pathSeparator}';// 文件列表,可选参数recursive,默认值为false,只遍历当前目录;设置为true时会遍历当前目录及子目录Stream<FileSystemEntity> fileList = Directory(path).list();await for(FileSystemEntity fileSystemEntity in fileList){print(fileSystemEntity);}
}, child: const Text("遍历文件"))
判断文件的类型
await for(FileSystemEntity fileSystemEntity in fileList){print('$fileSystemEntity');FileSystemEntityType type = FileSystemEntity.typeSync(fileSystemEntity.path);
}
文件的类型:
- file:文件
- directory:文件夹
- link:链接文件,比如:HTML文件、PDF文件、图片文件、音频文件、文本文件、JSON文件
- notFound:未知
文件夹重命名
_dirRename() async{Directory documentsDirectory = await getApplicationDocumentsDirectory();String path = '${documentsDirectory.path}${Platform.pathSeparator}dirName';var dir = Directory(path);var newName= await dir.rename('${dir.parent.absolute.path}${Platform.pathSeparator}newName');
}
删除文件夹
ElevatedButton(onPressed: () async{// 获取应用程序文件目录Directory appDocumentDirectory = await getApplicationDocumentsDirectory();String path ='${appDocumentDirectory.path}${Platform.pathSeparator}myAppName';try{// 可选参数recursive,默认false,只删除文件夹,如果文件夹下有内容则无法删除并抛出异常;true删除文件夹及文件夹下所有内容var dir = await Directory(path).delete();print('文件夹$path删除成功');}catch(err){print('文件夹$path删除失败:$err');}}, child: const Text("删除文件夹"))
文件
创建文件
ElevatedButton(onPressed: () async{// 获取应用程序目录Directory appDocumentDirectory = await getApplicationDocumentsDirectory();// 路径String path = '${appDocumentDirectory.path}${Platform.pathSeparator}myAppName${Platform.pathSeparator}test.txt';File file = File(path);if(file.existsSync()){print("文件已存在");}else{// 文件创建也存在recursive属性var file = await File(path).create();print("文件创建成功:$file");}}, child: const Text("创建文件"))
写入数据
写入字符串,覆盖写入
ElevatedButton(onPressed: () async{// 获取应用程序目录Directory appDocumentDirectory = await getApplicationDocumentsDirectory();// 路径String path = '${appDocumentDirectory.path}${Platform.pathSeparator}myAppName${Platform.pathSeparator}test.txt';File file = File(path);if(file.existsSync()){var res = await file.writeAsString("写入数据");print("写入成功:$res");}else{print("文件不存在");}
}, child: const Text("写入数据")),
写入bytes 数据,覆盖写入
file.writeAsBytes(Utf8Encoder().convert("bytes 格式"));
追加写入
file.openWrite(mode: FileMode.append).write('追加写入');
读取数据
读取字符串
ElevatedButton(onPressed: () async {// 应用程序目录Directory appDocumentDirectory =await getApplicationDocumentsDirectory();// 路径String path ='${appDocumentDirectory.path}${Platform.pathSeparator}myAppName${Platform.pathSeparator}test.txt';File file = File(path);if (file.existsSync()) {var res = await file.readAsString(encoding: utf8);print("文件读取成功,内容是:$res");} else {print("文件不存在");}},child: const Text("文件读取"))
按行读取数据
List<String> lines = await file.readAsLines();
lines.forEach((element) {print('$element');
});
读取 bytes 并转换为String
Utf8Decoder().convert(await file.readAsBytes());
删除
file.delete();
读取 assets 文件
读取项目中文件,项目中使用的文件一般都放在lib/assets
下
如果需要访问,需要在pubspec.yaml
文件中添加配置,例如:
assets:- assets/json/
读取
_loadAsset(BuildContext context) async{var jsonStr = await DefaultAssetBundle.of(context).loadString('assets/json/data.json');var list = json.decode(jsonStr);list.forEach((element) {print('$element');});
}
相关文章:
flutter:文件系统目录、文件读写
参考 参考:老孟 文件存储和网络请求 数据存储 Dart的 IO 库包含了文件读写的相关类,它属于 Dart 语法标准的一部分,所以通过 Dart IO 库,无论是 Dart VM 下的脚本还是 Flutter,都是通过 Dart IO 库来操作文件的。但…...
计算机提示“找不到vcruntime140.dll,无法继续执行代码可”以这样子修复
首先,对于那些不熟悉的人来说,vcruntime140.dll是一个关键文件,用于在Windows操作系统上运行使用C语言编写的大型应用程序。如果你正在运行或安装这样的应用程序,但找不到vcruntime140.dll文件,那么你的应用程序可能无…...
深度学习pytorch实战五:基于ResNet34迁移学习的方法图像分类篇自建花数据集图像分类(5类)超详细代码
1.数据集简介 2.模型相关知识 3.split_data.py——训练集与测试集划分 4.model.py——定义ResNet34网络模型 5.train.py——加载数据集并训练,训练集计算损失值loss,测试集计算accuracy,保存训练好的网络参数 6.predict.py——利用训练好的网…...
Rust in Action笔记 第五章 深入理解数据
如果希望看到f32类型的数转换成整型数字u32类型,需要在unsafe包裹下调用std::mem::transmute(data),因为在安全的Rust语法中没有把整型数据按照bit转换成浮点数据的实现,如果想要看到浮点数的二进制输出(通过{:b})&…...
Cocos creator实现飞机大战空中大战《战击长空》小游戏资源及代码
Cocos creator实现飞机大战空中大战《战击长空》小游戏资源及代码 最近在学习Cocos Creator,作为新手,刚刚开始学习Cocos Creator,刚刚入门,这里记录一下飞机大战小游戏实现。 https://wxaurl.cn/VEgRy2eTMyi 一 安装CocosDashBo…...
2.4 逻辑代数的基本定理
学习目标: 如果我要学习逻辑代数的基本定理,我会采取以下步骤: 1. 学习基本概念:首先,我会花时间了解逻辑代数的基本概念,如逻辑运算符(合取、析取、否定等)、真值表、逻辑等价性等…...
适用于 Linux 的 Windows 子系统wsl文档
参考链接:https://learn.microsoft.com/zh-cn/windows/wsl/ 鸟哥的Linux私房菜:http://cn.linux.vbird.org/ http://cn.linux.vbird.org/linux_basic/linux_basic.php http://cn.linux.vbird.org/linux_server/ 目录 安装列出可用的 Linux 发行版列出已…...
C++特殊类的设计与类型转换
特殊类的设计与类型转换 特殊类的设计请设计一个类,只能在堆上创建对象请设计一个类,只能在栈上创建对象请设计一个类,只能创建一个对象(单例模式) C的类型转换 特殊类的设计 请设计一个类,只能在堆上创建对象 通过new创建的类就…...
如何通过关键词搜索API接口
如果你是一位电商运营者或者是想要进行1688平台产品调研的人员,你可能需要借助API接口来获取你所需要的信息。在这篇文章中,我们将会讨论如何通过关键词搜索API接口获取1688的商品详情。 第一步:获取API接口的授权信息 在使用API接口前&…...
智驾域控新战争打响,谁在抢跑?
智能驾驶域控制器赛道,已经成为了时下最为火热的市场焦点之一。 最近,头部Tier1均胜电子公布了全球首批基于高通Snapdragon Ride第二代芯片平台的智能驾驶域控制器产品nDriveH,在这一赛道中显得格外引人注意。 就在不久之前,均胜…...
Android 13无源码应用去掉无资源ID的按钮
Android Wifionly项目,客户要求去掉谷歌联系人里的 手机联系人按钮 需求分析 无应用源码,只能通过系统侧去修改 首先通过 Android Studio 工具 uiautomatorviewer 获取父控件资源ID chip_group ,然后通过遍历获取子控件去掉目标按钮 --- a/frameworks/base/core/java/andr…...
【SCI征稿】中科院2区(TOP),正刊,SCIEEI双检,进化计算、模糊集和人工神经网络在数据不平衡中应用
【期刊简介】IF:8.0-9.0,JCR1区,中科院2区(TOP) 【检索情况】SCIE&EI 双检,正刊 【数据库收录年份】2004年 【国人占比】22.78%(期刊国际化程度高) 【征稿领域】进化计算、模…...
Android Audio开发——AAudio基础(十五)
AAudio 是一个自 Android O 引入的新的 Android C API。它主要是为需要低延迟的高性能音频应用设计的。应用程序通过直接从流中读取或向流中写入数据来与 AAudio 通信,但它只包含基本的音频输入输出能力。 一、AAudio概述 AAudio 在应用程序和 Android 设备上的音频输入输出之…...
SDK接口远程调试【内网穿透】
文章目录 1.测试环境2.本地配置3. 内网穿透3.1 下载安装cpolar内网穿透3.2 创建隧道 4. 测试公网访问5. 配置固定二级子域名5.1 保留一个二级子域名5.2 配置二级子域名 6. 使用固定二级子域名进行访问 转发自cpolar内网穿透的文章:Java支付宝沙箱环境支付࿰…...
Mybatis学习笔记二
目录 一、MyBatis的各种查询功能1.1 查询一个实体类对象1.2 查询一个List集合1.3 查询单个数据1.4 查询一条数据为map集合1.5 查询多条数据为map集合1.5.1 方法一:1.5.2 方法二: 二、特殊SQL的执行2.1 模糊查询2.2 批量删除2.3 动态设置表名2.4 添加功能…...
大屏数据可视化开源项目
一、DataGear —— 数据可视化项目 官网:DataGear - 开源免费的数据可视化分析平台 DataGear 是一款开源免费的数据可视化分析平台,数据可视化看板。 功能特性: 1、多种数据源,支持运行时接入任意提供 JDBC 驱动的数据库&#…...
面试经典150题:数组/字符串合集
新专栏,预计两个月写完吧,每天下班回来抽空做几道题。会把做题计划顺序记录下来,如果你有缘,刷到这个开篇序列,那就跟着文章去练题吧。初学者可以慢慢来 88. 合并两个有序数组 void merge(vector<int>& nums…...
Java源文件的执行过程
目录 1.JVM 2.字节码 3.Java源文件执行的过程 4.JIT(Just In Time Compilation) 5.AOT(Ahead Of Time Compilation) 6.AOT破坏Java动态性 7.编译型语言与解释型语言 8.Java-编译与解释并存的语言 9.Java和C的相同点与不同…...
10个ai算法常用库java版
今年ChatGPT 火了半年多,热度丝毫没有降下来。深度学习和 NLP 也重新回到了大家的视线中。有一些小伙伴问我,作为一名 Java 开发人员,如何入门人工智能,是时候拿出压箱底的私藏的学习AI的 Java 库来介绍给大家。 这些库和框架为机器学习、深度学习、自然语言处理等提供了广…...
怎么看服务器带宽大小 103.219.179.X
第一种,可以使用网站测速,这种方式比较便捷,但是由于网站测速是测试服务器发送数据包到他网站节点的一个速度情况,有时候节点问题或者服务器做了封包限制可能导致测试不准确的情况。 第二种,可以在IIS上架设一个大一点…...
图形编辑器开发:最基础但却复杂的选择工具
大家好,我是前端西瓜哥。 对于一个图形设计软件,它最基础的工具是什么?选择工具。 但这个选择工具,却是相当的复杂。这次我来和各位,细说细说选择工具的一些弯弯道道。 我正在开发的图形设计工具的: http…...
apk签名-signapk.jar
如果做平台app开发,需要签platform签名,除了通过adroid.bp或者android.mk的方式使用AOSP整个大工程中签名外,还可以直接通过signapk.jar的方式进行签名,效率更高更快捷简便。 首先我们来回顾下AOSP平台签名的办法。 Android.mk 使…...
【100个高大尚求职简历】简历模板+修改教程+行业分类简历模板 (涵盖各种行业) (简历模板+编辑指导+修改教程)
文章目录 1 简历预览2 简历下载 很多人说自己明明投了很多公司的简历,但是都没有得到面试邀请的机会。自己工作履历挺好的,但是为什么投自己感兴趣公司的简历,都没有面试邀请的机会。反而是那些自己没有投递的公司,经常给自己打电…...
Nginx平滑升级版本或添加模块
文章目录 一、Nginx 平滑升级二、升级失败 回滚操作三、遇到问题 一、Nginx 平滑升级 一般有两种情况下需要升级 nginx,一种是确实要升级 nginx 的版本,另一种是要为 nginx 添加新的模块。 Nginx平滑升级其原理简单概括: (1&am…...
高阶复杂网络重建:从时间序列中重建高阶网络
论文链接:https://www.nature.com/articles/s41467-022-30706-9 一、为什么要研究高阶网络? 复杂网络跟我们生活息息相关,例如社交网络的信息传播,疾病的感染扩散和基因调控网络的相互作用等。越来越多的研究突破了传统网络中两…...
Day05 03-MySQL主从-主主原理与搭建详解
文章目录 第十六章 MySQL的系统架构(主从架构)16.1 MySQL集群架构的介绍16.1.1 主从架构介绍16.1.2 主从复制的原理 16.2 MySQL主从复制的实现16.2.1 环境说明16.2.2 主库配置16.2.3 从库配置16.2.4 主从复制测试 16.3 MySQL主主复制的实现16.3.1 主主复…...
STL之vector
目录 vector模拟实现一. vector的基本框架二. 常用方法及实现1.初始化和清理a. 默认构造函数b. 析构函数 2. 迭代器a. beginb. end 3.数据访问a. sizeb. capacityc. operator[]d. frontc. back 4.增删查改操作a. reserveb. resizec. insertd. push_backe. erasef. pop_back 5.构…...
2020年CSP-J认证 CCF非专业级别软件能力认证第一轮真题-单项选择题解析
2020 CCF认证第一轮(CSP-J)真题 一、单项选择题 (共15题,每2分,共30分;每题有且有一个正确选项) 1、在内存储器中每个存储单元都被赋予一个唯一的序号,称为 A、下标 B、序号 C、地址 D、编号 答案:C…...
vscode Delete `␍⏎·····`
在公司拉取代码报错 Delete ␍⏎,首先问题的关键是换行导致,相信你看别的博客也知道为什么了,但是我使用别的博客的解决办法,没搞定,无论是配置 auto 还是命令行执行,都不行 下面介绍我的解决办法 我使用…...
读书笔记-《ON JAVA 中文版》-摘要16[第十六章 代码校验]
文章目录 第十六章 代码校验1. 测试1.1 单元测试1.2 JUnit1.3 测试覆盖率的幻觉 2. 前置条件2.1 断言(Assertions)2.2 Java 断言语法2.3 Guava 断言2.4 使用断言进行契约式设计2.4.1 检查指令2.4.2 前置条件2.4.3 后置条件2.4.4 不变性2.4.5 放松 DbC 检…...
可以做推广的门户网站/线上销售渠道有哪几种
根据此视频入门即可 https://www.bilibili.com/video/av54488377?fromsearch&seid15888036743951343421 把Auto.js的“后台弹出界面” 的权限打开,不进入Auto.js也可以运行调试脚本。...
辽宁城乡建设部网站首页/推销产品的软文500字
StringBuilder和StringBuffer是可变字符序列 区别: StringBuilder的线程不安全,但是效率高。 StringBuffer的线程安全,但是效率低。 StringBuilder: StringBuilder sb new StringBuilder(); //这里初始化一个默认长度16的char数组…...
上海企业网站建设方案/河源市企业网站seo价格
毕设要做这个项目 1.UCF101数据集下载(用4G下载貌似快一点) https://www.crcv.ucf.edu/data/UCF101/UCF101.rar 2.标注文件及训练数据和测试数据的列表文件 https://www.crcv.ucf.edu/data/UCF101/UCF101TrainTestSplits-RecognitionTask.zip 文章集锦 简…...
新注册公司怎么做网站/百度推广关键词优化
1 问题 想实现如下的功能,在全网都找不到一个例子解析。如果使用如下的p标签,就会出现这一行换行的情况,根本不能实现一行两部分:一部分左对齐,一部分右对齐的要求 <p align"right">诶嘿</p>2…...
做外贸网站格式/免费推广公司的网站
现在网络攻击非常严重,作为一个合格的程序员必须懂得如何处理网站安全问题,比如一个API接口如果不处理,可能会被不良人员恶意调用,占用服务器资源。这里精准像素分享一个简单的PHP限制同IP一天访问次数方法,适合不太懂…...
浙江网站建设/电商平台推广公司
* android.telephony.TelephonyManager类作用:访问设备上的电话通讯服务的信息获取方法:Context.getSystemService(Context.TELEPHONY_SERVICE)获取* GsmCellLocation类作用:封装GSM移动电话的基站信息具体代码实现:// 获取Teleph…...