Flutter笔记:目录与文件存储以及在Flutter中的使用(上)
作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263
邮箱 :291148484@163.com
本文地址:https://blog.csdn.net/qq_28550263/article/details/134499297
【简介】本文探讨了Dart和Flutter中的文件系统操作和文件存储。内容覆盖了Dart的文件系统基础,文件路径处理,文件读写操作及其优化(上),以及在Flutter中的文件读写相关注意的事项(下)。
目 录
- 1. 概述
- 2. Dart文件系统基础
- 2.1 文件(File)
- 2.2 目录(Directory)
- 2.2.1 目录的概念
- 2.2.2 目录的操作
- 创建目录
- 列出目录内容
- 删除目录
- 2.2.3 一个注意点:关于目录的字符串表示
- 2.3 链接(Link)
- 2.3.1 链接的概念
- 2.3.2 硬链接 和 软链接
- 1. 硬链接
- 2. 软链接
- 2.3.3 链接的操作
- 创建链接
- 获取链接的目标
- 更新链接的目标
- 删除链接
- 3. Dart文件路径操作
1. 概述
本文主要介绍了Dart和Flutter中的文件系统操作和文件存储。首先,我们将探讨Dart中的文件系统基础,包括文件、目录和链接的基本概念及其操作方法。然后,我们将学习如何在Dart中处理文件路径,以及如何进行文件的读写操作。接着,我们将讨论如何在Flutter中进行文件存储,包括如何使用path_provider库来获取应用的文件存储路径,以及如何读写特殊类型的文件。最后,我们将探讨文件读写的性能优化。希望通过本文,你能够对Dart和Flutter中的文件操作有一个全面的了解。
2. Dart文件系统基础
本小节将介绍文件的基本概念、操作方法以及错误处理和异常捕获。
2.1 文件(File)
本小节包括3个子小节,讲解文件的基本概念、操作方法以及错误处理和异常捕获。
2.1.1 文件的概念
文件是存储在磁盘上的数据的集合,可以包含任何类型的数据,如文本、图片、音频等。文件是计算机中用于数据存储的基本单位,它可以包含各种类型的数据,如程序代码、文本文档、图片、音频和视频等。
在 Dart 中,我们可以使用 dart:io
库中的 File 类来操作文件。File类提供了一系列的方法,如 readAsString
、writeAsString
、readAsBytes
、writeAsBytes
等,用于读取和写入文件。这些方法都是异步的,因此在使用它们时,我们需要使用await关键词来等待操作完成。
以下是一个简单的示例,演示如何使用 File 类来创建一个新文件,并向其中写入一些文本:
在这个示例中,我们首先导入了 dart:io
库,然后创建了一个File对象,表示一个名为’test.txt’的文件。然后,我们使用 writeAsString
方法向文件中写入了一些文本。由于 writeAsString
方法是异步的,我们需要使用 await
关键词来等待操作完成。
import 'dart:io';void main() async {var file = File('test.txt');await file.writeAsString('Hello, Dart!');
}
注意,由于我们在 main 函数中使用了 await
关键词,因此我们需要将 main
函数声明为异步函数,即在函数声明前添加 async
关键词。
2.1.2 文件的操作
在 Dart 中,我们可以使用 File 类的各种方法来操作文件,包括创建、读取、写入和删除等操作。
以下是一些常用的文件操作方法的示例:
- 创建文件:使用
create
方法可以创建一个新的文件。如果文件已经存在,create
方法不会有任何效果。如果你希望覆盖已经存在的文件,可以给create
方法传入一个名为recursive
的参数,将其设为true
。
import 'dart:io';void main() async {var file = File('test.txt');await file.create();
}
- 读取文件:使用
readAsString
方法可以读取文件的内容,返回一个字符串。如果文件不存在,readAsString
方法会抛出一个异常。
import 'dart:io';void main() async {var file = File('test.txt');String contents = await file.readAsString();print(contents);
}
- 写入文件:使用
writeAsString
方法可以向文件中写入字符串。如果文件不存在,writeAsString
方法会创建一个新的文件。如果文件已经存在,writeAsString
方法会覆盖文件的内容。
import 'dart:io';void main() async {var file = File('test.txt');await file.writeAsString('Hello, Dart!');
}
- 删除文件:使用
delete
方法可以删除一个文件。如果文件不存在,delete
方法不会有任何效果。
import 'dart:io';void main() async {var file = File('test.txt');await file.delete();
}
在实际使用中,你可能还需要处理各种可能出现的错误和异常,例如文件不存在、没有权限等。这些内容将在后续小节中讲解。
2.1.3 错误处理和异常捕获
在进行文件操作时,可能会出现各种错误和异常,例如文件不存在、没有读写权限等。在 Dart 中,我们可以使用 try-catch 语句来捕获和处理这些错误和异常。
以下是一些常见的错误处理和异常捕获的示例:
- 文件不存在:当我们试图读取或删除一个不存在的文件时,Dart会抛出一个 FileSystemException 异常。我们可以捕获这个异常,然后进行相应的处理,例如创建一个新的文件或者给用户显示一个错误消息。
import 'dart:io';void main() async {var file = File('test.txt');try {String contents = await file.readAsString();print(contents);} catch (e) {print('Error: $e');}
}
在这个示例中,如果 ‘test.txt’ 文件不存在,readAsString方法会抛出一个 FileSystemException 异常,然后我们在catch语句中捕获这个异常,并打印一个错误消息。
- 没有读写权限:当我们试图读取或写入一个我们没有权限访问的文件时,Dart 也会抛出一个 FileSystemException 异常。我们可以捕获这个异常,然后进行相应的处理,例如请求用户提供权限或者给用户显示一个错误消息。
import 'dart:io';void main() async {var file = File('/root/test.txt');try {await file.writeAsString('Hello, Dart!');} catch (e) {print('Error: $e');}
}
在这个示例中,如果我们没有权限写入 ‘/root/test.txt’ 文件,writeAsString 方法会抛出一个 FileSystemException 异常,然后我们在 catch 语句中捕获这个异常,并打印一个错误消息。
在实际使用中,可能还需要处理其他类型的错误和异常,例如磁盘空间不足等。处理这些错误和异常的方法和上述示例类似,关键是要正确地识别错误类型,然后进行相应的处理。
2.2 目录(Directory)
本小节将介绍目录的基本概念及其在Dart中的操作方法。
2.2.1 目录的概念
目录是文件的容器,可以包含文件和其他目录。在文件系统中,目录用于组织文件,使得我们可以更方便地管理和访问文件。一个目录可以包含任意数量的文件和子目录。
在 Dart 中,我们可以使用dart:io库中的 Directory 类来操作目录。Directory 类提供了一系列的方法,如create、list、delete等,用于创建、列出和删除目录。这些方法都是异步的,因此在使用它们时,我们需要使用await关键词来等待操作完成。
以下是一个简单的示例,演示如何使用Directory类来创建一个新目录:
import 'dart:io';void main() async {var directory = Directory('test');await directory.create();
}
在这个示例中,我们首先导入了dart:io库,然后创建了一个 Directory 对象,表示一个名为 ‘test’ 的目录。然后,我们使用 create 方法创建了这个目录。由于 create 方法是异步的,我们需要使用 await 关键词来等待操作完成。
注意,由于我们在 main 函数中使用了 await 关键词,因此我们需要将 main 函数声明为异步函数,即在函数声明前添加 async 关键词。
2.2.2 目录的操作
在 Dart 中,我们可以使用 Directory 类的各种方法来操作目录,包括创建、列出内容和删除等操作。
以下是一些常用的目录操作方法的示例:
创建目录
使用 create
方法可以创建一个新的目录。如果目录已经存在,create
方法不会有任何效果。如果你希望创建的目录的父目录不存在,可以给 create
方法传入一个名为 recursive
的参数,将其设为 true
。
import 'dart:io';void main() async {var directory = Directory('test');await directory.create();
}
列出目录内容
使用list方法可以列出目录的内容,包括文件和子目录。list
方法返回一个 Stream 对象,我们可以使用 await for
语句来遍历这个 Stream。
import 'dart:io';void main() async {var directory = Directory('test');await for (var entity in directory.list()) {print(entity.path);}
}
注:
await for
是一种特殊的循环结构,用于处理异步流。 await for 循环会订阅 提供的流,并等待流生成新的值。
每当流生成新的值,循环体就会使用这个值进行一次迭代。当流关闭时,循环就会结束。
删除目录
使用 delete 方法可以删除一个目录。如果目录不存在,delete 方法不会有任何效果。如果你希望删除的目录包含文件或子目录,可以给 delete 方法传入一个名为 recursive 的参数,将其设为true。
import 'dart:io';void main() async {var directory = Directory('test');await directory.delete();
}
在实际使用中,你可能还需要处理各种可能出现的错误和异常,例如目录不存在、没有权限等。这些内容将在后续的章节中讲解。
2.2.3 一个注意点:关于目录的字符串表示
如果你正在使用的是 Windows 系统,并且上面的代提示一些路径方面的错误,那么或许本小节可以帮助到你。
假设你有一个目录为 D:\SOFTWARES\postgresql
(Windows系统上),现在你想输出该目录中所有的文件,如果直接使用这段字符串,那就是:
// 错误示例
import 'dart:io';void main() async {var directory = Directory('D:\SOFTWARES\postgresql');await for (var entity in directory.list()) {print(entity.path);}
}
这是一个错误的写法。因为在 Dart 中,字符串中的反斜杠 \
是一个特殊字符,用于引入转义序列,因此你需要使用两个反斜杠 \\
,那么就是:
var directory = Directory('D:\\SOFTWARES\\postgresql');
但是如果你觉得这样太麻烦了,不想再后动为你复制过来的 Windows 系统上的位置添加这么多的 \
进行转移,那么就应该使用 原始字符串 (raw string)来避免处理转义字符。
原始字符串以 r
开头,如 r"Hello\nWorld"
。在原始字符串中,\
字符没有特殊含义,所以你可以直接使用 \
而不是 \\
。因此,下面的写法也是正确的:
var directory = Directory(r'D:\SOFTWARES\postgresql');
哦,似乎你知道 Python 等一些语言也是这样的。那就用起来吧。
2.3 链接(Link)
本小节将介绍链接的基本概念以及在Dart中如何操作链接。
2.3.1 链接的概念
链接是指向另一个文件或目录的引用。在文件系统中,链接可以使我们在不复制文件内容的情况下,从不同的位置访问同一个文件。这对于节省存储空间和提高数据管理的效率非常有用。链接可以分为两种类型:硬链接 和 软链接(也被称为 符号链接)。
2.3.2 硬链接 和 软链接
在以前写的另外一篇文章中关于链接有更加详细的介绍,包括如何直接通过命令创建链接 《链接、包管理工具、polyrepo、monorepo以及Lerna 工具的使用》,地址为 https://jclee95.blog.csdn.net/article/details/129903902。感兴趣的读者可以参考。
硬链接和软链接是两种不同类型的链接,它们的主要区别在于指向文件的方式不同。
1. 硬链接
硬链接 是指向文件的物理位置的引用。换句话说,硬链接和它所指向的文件在文件系统中是等价的,它们共享同一块存储空间。这意味着,如果你删除了硬链接,它所指向的文件仍然存在;如果你修改了硬链接的内容,它所指向的文件的内容也会被修改。
2. 软链接
软链接(也称为 符号链接 或 symlink)是指向另一个链接或文件的路径的引用。软链接和它所指向的文件在文件系统中是独立的,它们不共享存储空间。这意味着,如果你删除了软链接,它所指向的文件不会受到影响;如果你修改了软链接的内容,它所指向的文件的内容不会被修改。
在大多数情况下,我们都会使用软链接,因为它更加灵活和方便。然而,在某些情况下,硬链接可能会更有用。例如,如果你希望在不增加存储空间的情况下,从不同的位置访问同一个文件,你可以使用硬链接。
在下一节中,我们将讨论如何在 Dart 中操作链接。
2.3.3 链接的操作
在 Dart 中,我们可以使用Link类的各种方法来操作链接,如 create
和 delete
等。
创建链接
使用 create
方法可以创建一个新的链接。如果链接已经存在,create
方法会覆盖已经存在的链接。
import 'dart:io';void main() async {var link = Link('link');await link.create('test.txt');
}
在这个示例中,我们创建了一个新的链接,该链接指向名为 ‘test.txt’ 的文件。
获取链接的目标
使用 target 方法可以获取链接的目标。
import 'dart:io';void main() async {var link = Link('link');String target = await link.target();print(target);
}
在这个示例中,我们获取了链接的目标,并将其打印出来。
更新链接的目标
使用update方法可以更新链接的目标。
import 'dart:io';void main() async {var link = Link('link');await link.update('new_target.txt');
}
在这个示例中,我们更新了链接的目标,将其指向名为 ‘new_target.txt’ 的文件。
删除链接
使用 delete 方法可以删除一个链接。如果链接不存在,delete 方法不会有任何效果。
import 'dart:io';void main() async {var link = Link('link');await link.delete();
}
在这个示例中,我们删除了链接。
3. Dart文件路径操作
3.1 路径的概念
路径是文件或目录在文件系统中的位置。它是一个字符串,由一系列的名称组成,这些名称代表从文件系统的根目录到文件或目录的路径。在路径中,名称之间通常由特殊的字符(如斜杠/或反斜杠\)分隔。
例如,路径 /home/user/documents/report.txt 表示在 home 目录下的 user 目录下的 documents 目录下的 report.txt 文件。
在 Dart 中,我们可以使用字符串来表示路径。例如,我们可以创建一个表示文件路径的字符串,然后使用这个字符串来创建一个 File 对象:
import 'dart:io';void main() {var path = '/home/user/documents/report.txt';var file = File(path);
}
在这个示例中,我们首先创建了一个表示文件路径的字符串,然后使用这个字符串来创建了一个File对象。
【注意】不同的操作系统可能使用不同的字符来分隔路径中的名称。
例如,Unix
和Linux
系统使用斜杠/
,而 Windows 系统使用反斜杠\
。
为了编写可移植的代码,我们应该尽可能避免直接在代码中使用这些特殊字符,而是使用Dart
提供的路径操作函数,如join
。这些函数可以正确地处理不同操作系统的路径分隔符。
3.3 路径的操作
在 Dart 中,我们可以使用 path 库中的各种函数来操作路径。这个库提供了一系列的函数,用于连接路径、获取路径的基名、分割路径等。
3.3.1 连接路径(join)
join 函数可以连接两个或多个路径。它会自动处理路径中的分隔符,使得你的代码可以在不同的操作系统上正确运行。
import 'package:path/path.dart' as path;void main() {var p = path.join('/home/user', 'documents', 'report.txt');print(p); // Outputs: /home/user/documents/report.txt
}
3.3.2 获取路径的基名(basename)
basename 函数可以获取路径的基名,即路径的最后一部分。
import 'package:path/path.dart' as path;void main() {var name = path.basename('/home/user/documents/report.txt');print(name); // Outputs: report.txt
}
3.3.3 分割路径(split)
split函数可以分割路径,将路径分解为它的各个部分。
import 'package:path/path.dart' as path;void main() {var parts = path.split('/home/user/documents/report.txt');print(parts); // Outputs: ['/', 'home', 'user', 'documents', 'report.txt']
}
3.3.4 获取路径的目录名(dirname)
dirname 函数可以获取路径的目录名,即除去最后一部分的路径。
import 'package:path/path.dart' as path;void main() {var dir = path.dirname('/home/user/documents/report.txt');print(dir); // Outputs: /home/user/documents
}
3.3.5 获取路径的扩展名(extension)
extension函数可以获取路径的扩展名,即最后一部分中的点(.)之后的部分。
import 'package:path/path.dart' as path;void main() {var ext = path.extension('/home/user/documents/report.txt');print(ext); // Outputs: .txt
}
3.3.6 判断路径是否为绝对路径(isAbsolute)
isAbsolute 函数可以判断路径是否为绝对路径。绝对路径是从文件系统的根目录开始的路径,而相对路径是从当前目录开始的路径。
import 'package:path/path.dart' as path;void main() {var isAbs = path.isAbsolute('/home/user/documents/report.txt');print(isAbs); // Outputs: true
}
相关文章:
Flutter笔记:目录与文件存储以及在Flutter中的使用(上)
Flutter笔记 目录与文件存储以及在Flutter中的使用(上) 文件系统基础知识与路径操作 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:h…...
注意了!申请流量卡时地址一定不要填写学校,不好下卡哦!
当我们在网上购买流量卡时,都会要求让填写准确的收货地址,但是对于收货地址你填对了吗? 很多朋友在提交流量卡申请之后,往往会被运营商拒审,对于拒审的原因除了比较常见的信息填写有有误、涉及禁发地区、重复申…...
minio使用shell上传文件
minio使用shell上传文件 前言1. 编写调用脚本2.测试脚本上传3.候选脚本 前言 业务场景需要实现,服务器文件上传至存储服务。一种方式是安装minio的linux客户端,另一种方式是通过调用minio的api接口实现文件上传。后一种方式不需要依赖minio的客户端使用…...
LeetCode538. Convert BST to Greater Tree
文章目录 一、题目二、题解 一、题目 Given the root of a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus the sum of all keys greater than the original key in BST. As a remin…...

iPaaS和RPA,企业自动化应该如何选择?
全球著名的咨询调查机构Gartner在2022年初再次发布了《2022年12大技术趋势》报告。 Gartner是全球最具权威的IT研究与顾问咨询公司,成立于1979年,在界定及分析那些决定了商业进程的发展趋势与技术方面,它拥有二十年以上的丰富经验,…...

AI实践与学习1_Milvus向量数据库实践与原理分析
前言 随着NLP预训练模型(大模型)以及多模态研究领域的发展,向量数据库被使用的越来越多。 在XOP亿级题库业务背景下,对于试题召回搜索单单靠着ES集群已经出现性能瓶颈,因此需要预研其他技术方案提高试题搜索召回率。…...
3Dexcite deltgen 2022x 新功能
3DEXCITE DELTAGEN 2022x 现已发布,此次新版发布包含 DELTAGEN 2022x,DELTAGEN MARKETING SUITE 2022x,DELTAGEN XPLORE 2022x,以及软件开发工具包 SDK FOR DELTAGEN 2022x 版本。赶快来获取最新 DG 版本,了解新增内容…...
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形 文章链接:柱状图中最大的矩形 视频链接:柱状图中最大的矩形 1. LeetCode 84. 柱状图中最大的矩形 1.1 思路 本题是给一个数组形象得画出图后求矩形的最大面积是多少。本题和42. 接雨水…...

【2023云栖】陈守元:阿里云开源大数据产品年度发布
本文根据 2023 云栖大会演讲实录整理而成,演讲信息如下: 演讲人:陈守元 | 阿里云计算平台事业部开源大数据产品总监 演讲主题:阿里云开源大数据产品年度发布 随着云计算的不断发展,未来数据处理和应用的趋势将围绕C…...
Element UI 禁用数字输入框组件添加鼠标滚动事件
Element UI 禁用数字输入框组件添加鼠标滚动事件 <el-input type"number" mousewheel.native.prevent DOMMouseScroll.native.prevent :min"0" onkeyup"this.valuethis.value.match(/\d\.?\d{0,2}/);"v-model"form.threeYearDevelop…...

担忧CentOS停服?KeyarchOS系统来支撑
担忧CentOS停服?KeyarchOS系统来支撑 近年发生的“微软黑屏门”、“微软操作系统停更”等安全事件,敲响了我国 IT 产业的警钟,建立由我国主导的 IT 产业生态尤为迫切。对此,我国信息技术应用创新行业乘势而起,旨在通过…...

聚观早报 |联想集团Q2财季业绩;小鹏汽车Q3营收
【聚观365】11月17日消息 联想集团Q2财季业绩 小鹏汽车Q3营收 微软发布两款自研AI芯片 FAA批准SpaceX再次发射星际飞船 2023 OPPO开发者大会 联想集团Q2财季业绩 全球数字经济领导企业联想集团公布截至2023年9月30日的2023/24财年第二财季业绩:整体营收达到10…...
SAP ABAP权限控制中常用TCODE
权限控制中的几个TCODE 1.创建新的权限对象并在程序中使用 利用SU21创建权限对象Z_TEST,在程序中检查授权。 检查的代码如下: AUTHORITY-CHECK OBJECT ‘Z_TEST’ID ‘ACTION’ FIELD ‘44′ID ‘BUKRS’ FIELD DUMMY .IF sy-subrc NE 0.MESSAGE e00…...

云计算赛项容器云2023搭建
部署容器云平台[5 分] 使 用 OpenStack 私 有 云 平 台 创 建 两 台 云 主 机 , 云 主 机 类 型 使 用 4vCPU/12G/100G 类型,分别作为 Kubernetes 集群的 Master 节点和 node 节点, 然后完成 Kubernetes 集群的部署,并完成 Istio …...
11.1 文件拷贝移动与删除
在编程中,针对磁盘与目录的操作也是非常重要的,本章将重点介绍如何实现针对文件目录与磁盘的操作方法,其中包括了删除文件,文件拷贝,文件读写,目录遍历输出,遍历磁盘容量信息,磁盘格…...
redhat下使用CentOS yum源,并安装docker
一、安装yum源 1.卸载yum # 查看系统自身安装的yum软件包 rpm -qa | grep yum # 卸载软yum件包 rpm -e 软件包名称 --nodeps #可以使用简称如 rpm -e yum-* --nodeps2. 安装yum [rootbogon ~]# rpm -ivh --nodeps https://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/Pa…...

基于单片机体温脉搏检测控制系统及源程序
一、系统方案 1、本设计采用51单片机作为主控器。 2、DS18B20传感器检测体温。 3、红外对接管采集心率值送到液晶1602显示。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 /lcd1602初始化设置*/ void init_1602() { write_com(0x38); //显示…...
MyBatis-Plus逻辑删@TableLogic
MyBatis-Plus逻辑删除指,在数据库中删除数据时,并没有真正的删除,而是更改指定字段的值,这个字段的值可以为0或1,0代表未删除,1代表已删除,所以delete操作实际上是update操作,查询操作也是要加w…...

本地私域线上线下 线上和线下的小程序
私域商城是一种新型的零售模式,它将传统的线下实体店与线上渠道相结合,通过会员、营销、效率等方式,为消费者提供更加便利和高效的购物体验。私域商城的发展趋势表明,它将成为未来零售业的重要模式,引领零售业的创新和…...

【前端学java】java中的Object类(8)
往期回顾: 【前端学java】JAVA开发的依赖安装与环境配置 (0)【前端学 java】java的基础语法(1)【前端学java】JAVA中的packge与import(2)【前端学java】面向对象编程基础-类的使用 (…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...