当前位置: 首页 > news >正文

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

看了下很多文章,本地文件存储都只有存储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.lryc.cn/news/89364.html

相关文章:

  • C语言基础知识:内存分配
  • 【Simulink】示波器图形数据导入Matlab重新绘图(论文)
  • 汇编调试及学习
  • Linux - 第19节 - 网络基础(传输层二)
  • web实现日历、阳历农历之间相互转换、npm、push、unshift、includes、innerHTML
  • GcExcel v6.1 支持新的 ‘.sjs‘ 模板文件 ‘.xltx‘ 格式 Crack
  • 面试官:MySQL自增主键一定是连续的吗?
  • 2023ACP世界大赛教育者论坛:让职业教育直面AI机遇与挑战
  • Unity基础 音频组件以及音频播放
  • SAP-MM-采购申请审批那些事!
  • 专业解读财务共享实现财务数智化转型的有效路径
  • 九章云极DataCanvas公司诚邀您共享AI基础软件前沿技术盛宴
  • 【高级语言程序设计(一)】第 10 章:文件
  • Android 宿主启动插件中的Activity和Service
  • 00后卷王自述,我真的很卷吗?
  • 真题详解(树的结点)-软件设计(八十四)
  • LDA算法实现鸢尾花数据集降维
  • 深入理解Linux虚拟内存管理
  • 自动化测试框架、Python面向对象以及POM设计模型简介
  • 【CSSpart4--盒子模型】
  • Linux - Java 8 入门安装与重装教程集锦
  • 2023年最新企业网盘排行榜出炉
  • C++内存分类
  • 不是说00后已经躺平了吗,怎么还是这么卷.....
  • 国内免费版ChatGPT
  • 常用本地事务和分布式事务解决方案模型
  • 无代码玩转GIS应用,我也在行【文末送书】
  • xlsx是什么格式
  • 将 Maven 配置为使用阿里云镜像
  • 行业报告 | 2022文化科技十大前沿应用趋势(下)