flutter-读写二进制文件到设备

news/2024/10/23 9:25:27/

看了下很多文章,本地文件存储都只有存储txt文件,我们探索下存储二进制文件吧。

保存二进制文件到设备硬盘上。
我们保存一个图片到手机本地上,并读取展示图片到app上。
以百度logo图为例子

写入图片
逻辑如下: 获取本地路径 -> 根据图片url开始下载获取到二进制文件 -> 图片文件写入到本地路径
写入本地文件
写入文件有几种方式点我查看file文档
分别是字符串和二进制,而写入的时候分同步和异步,所以写入的有4种。\

看writeAsBytes这个函数名字,这厮需要bytes
代码

  writeFile(String filePath, String imgUrl){File file = new File(filePath);if(!file.existsSync()) {file.createSync();}getRemoteFileStream(imgUrl, (fileInfo){if(fileInfo["ok"]){file.writeAsBytes(fileInfo["bytes"]);}else{debugPrint("异常");}});}

获取远程文件流
新建一个http连接,使用dartimport ‘dart:io’;自带的哦。
使用Uri.parse解析完整的url
request.close()开始发送请求(小声bb:这个命名一言难尽)
获取到数据后,response是一个HttpClientResponse类型,而HttpClientResponse类型Stream的实现
java复制代码abstract class HttpClientResponse implements Stream<List>
关于Stream说起来比较复杂,推荐一个文章传送门
Stream最后会吐出List,也就是我们需要的Bytes
代码
scss复制代码

// get文件流
getRemoteFileStream(String url, cb) async{return new Future(() async{HttpClient httpClient = new HttpClient();HttpClientRequest request = await httpClient.getUrl(Uri.parse(url));HttpClientResponse response = await request.close();if (response.statusCode == HttpStatus.ok) {List<int> buffer = [];response.listen((data){data.forEach((e){buffer.add(e);});},onDone: (){cb({"ok": true,"bytes": buffer});},onError: (e){print(e);});}else{debugPrint('HTTP request failed');}});
}

写好了上面两个函数,我们现在可以获取本地文件路径来写入图片了
最后一步,执行写入
获取本地路径分为临时文件和文档路径
我们使用path_provider来获取本地路径
arduino复制代码path_provider: ^1.4.0

import 'package:path_provider/path_provider.dart';
获取本地路径,执行读写本地文件
代码
ini复制代码getLocalhostBooks() async{String imgUrl = 'https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/11/1/16e24dc995c95343~tplv-t2oaga2asx-image.image';Directory tempDir = await getTemporaryDirectory();Directory appDocDir = await getApplicationDocumentsDirectory();debugPrint('本地路径');debugPrint(tempDir.path);debugPrint(appDocDir.path);String testPath = '${appDocDir.path}/test.png';// // 写入图片// writeFile(testPath, imgUrl);// 读取图片readFile(testPath, imgUrl);
}

读取
读取本地文件
ini复制代码

readFile(String filePath, String imgUrl) async{
File file = new File(filePath);
Uint8List fileBytes = await file.readAsBytes();
setState(() {
imgBytes = fileBytes;
print(imgBytes);
});
}

读取比较简单一点,获取bytes,然后渲染就是了。
ini复制代码setState(() {
imgBytes = fileBytes;
print(imgBytes);
});
php复制代码Container(
child: Image.memory(imgBytes, gaplessPlayback: true,),
)
效果

链接:https://juejin.cn/post/6844903985132879885 https://www.kkview.com


http://www.ppmy.cn/news/102718.html

相关文章

GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理

目录 管道&#xff08;channel&#xff09; 无缓冲管道 有缓冲管道 需要注意 goroutine与channel实现并发 单向管道 定义单向管道 将双向管道转换为单向管道 单向管道作为函数参数 单向管道的代码示例 select多路复用 案例演示 goroutine panic处理 案例演示 管道…

Musl libc 库成功适配到 openEuler Embedded,推动欧拉嵌入式生态发展

近期&#xff0c;RISC-V SIG 在欧拉嵌入式操作系统上成功实现了 musl libc 的适配&#xff0c;完成了使用 musl libc 库替换 glibc 库构建镜像的工作。目前&#xff0c;以 musl libc 为基础库编译的镜像已在 Raspberry Pi4 开发板上可用&#xff0c;这一成果推动了 openEuler E…

2023音视频开发程序员未来10年路线选择

2023音视频开发程序员未来10年路线选择&#xff1a; 音视频领域&#xff0c;其实你可以分三个部分来看&#xff0c; 第一是音视频本身&#xff0c;第二是网络通讯&#xff0c;第三是图像处理。 音视频本身涉及到音视频视频编解码啊&#xff0c;各种视频容器啊等等协议规范。 网…

“外行转网工,我只用了三个月”

大家好&#xff0c;我是老杨。 在这行发展了这么多年&#xff0c;经常会有人来问我&#xff0c;网工该怎么提升自己&#xff0c;又或是怎么入行。 其实这事儿不难想&#xff0c;技术工种最需要做的是什么&#xff0c;自然是提升技术。 而技术提升&#xff0c;途径也只有学习…

企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + 前后端分离 + 二次开发

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

拼多多获取整站实时商品详情数据|商品标题|商品链接,数据采集,数据分析提取教程

拼多多是一个基于社交电商的购物平台&#xff0c;它通过通过价格和优惠吸引大量用户&#xff0c;使用户形成消费场景和消费共同体&#xff0c;最终实现规模效应。在拼多多运营中&#xff0c;API接口起到了重要的作用&#xff0c;它可以实现不同系统之间的信息共享和数据传递&am…

机器学习常识 7: 决策树

摘要: 决策树是一种与人类思维一致, 可解释的模型. 1. 决策树的结构 人类的很多知识以决策规则的形式存储: 如果今天是阴天 (outlook overcast), 就去打球.如果今天出太阳 (outlook sunny) 而且湿度不高于 70% (humidity ≤ \le ≤ 70), 就去打球.如果今天出太阳 (outloo…