linux下文件读写操作
Linux下,文件I/O是操作系统与文件系统之间进行数据传输的关键部分。文件I/O操作允许程序读取和写入文件,管理文件的打开、关闭、创建和删除等操作。
1. 文件描述符
在Linux中,每个打开的文件都由一个文件描述符来表示。文件描述符是一个非负整数,通常从0开始,分别表示标准输入stdin、标准输出stdout和标准错误stderr。用户程序打开文件后,操作系统会为其分配一个文件描述符。
2. 文件操作函数
Linux提供了一系列的系统调用和库函数来进行文件操作,主要包括:
-
打开文件
-
open()
打开文件并返回文件描述符。文件描述符是进程访问文件的句柄,后续的
read()
和write()
操作都需要通过它进行。int fd = open("filename", O_RDONLY);
-
-
读取文件
-
read()
从文件中读取数据。
char buf[1024]; ssize_t bytes_read = read(fd, buf, sizeof(buf));
- 流程
- 进程调用
read()
,请求从文件中读取数据。 - 内核检查页缓存中是否存在请求的数据
- 如果数据在页缓存中,内核将数据从页缓存复制到用户空间的缓冲区。
- 如果数据不在页缓存中,内核会从磁盘读取数据到页缓存,然后再复制到用户空间。
- 返回实际读取的字节数。
- 进程调用
- 流程
-
-
写入文件
-
write()
向文件中写入数据。
const char *text = "Hello, world!"; ssize_t bytes_written = write(fd, text, 13);
- 流程
- 进程调用
write()
,请求将数据写入文件。 - 内核将数据从用户空间复制到页缓存中。
- 数据被标记为“脏页”,表示需要写回磁盘。
- 内核的页回写机制会在适当的时候将脏页写回磁盘。
- 进程调用
- 流程
-
-
页缓存的作用
- 页缓存是内核维护的一块内存区域,用于缓存文件数据。
- 作用
- 减少磁盘I/O:通过缓存文件数据,减少对磁盘的直接访问,提高性能。
- 延迟写入:
write()
操作不会立即将数据写入磁盘,而是先写入页缓存,由内核在后续的某个时间点写回磁盘。 - 预读机制:内核会提前读取文件数据到页缓存中,优化后续的
read()
操作。
-
关闭文件
-
close()
使用
close()
系统调用关闭文件,释放文件描述符。close(fd);
-
-
文件状态信息
fstat()
: 获取文件的状态信息。stat()
: 获取文件的状态信息(用于路径名)。
-
页回写机制
- 内核会在以下情况下将脏页写回磁盘
- 页缓存中的脏页达到一定比例。
- 进程调用
fsync()
或fdatasync()
强制刷新页缓存。 - 系统内存不足时,内核会回收脏页。
- 内核会在以下情况下将脏页写回磁盘
3. 文件打开模式
在使用open()
函数时,可以指定不同的文件打开模式
O_RDONLY
: 只读模式。O_WRONLY
: 只写模式。O_RDWR
: 读写模式。O_CREAT
: 如果文件不存在则创建文件。O_TRUNC
: 如果文件存在并以写入模式打开,则将其截断为零长度。O_APPEND
: 以追加模式打开文件。
4. 文件I/O缓冲
Linux使用缓冲区来提高文件I/O的效率。标准库函数如fread()
、fwrite()
通常会使用缓冲I/O,而系统调用如read()
、write()
则直接与内核进行交互。缓冲区的使用可以减少系统调用的次数,从而提高性能。
5. 文件锁定
在多进程或多线程环境中,文件锁定机制可以防止多个进程同时写入同一个文件,导致数据不一致。常用的文件锁定方法包括
- 共享锁(read lock):允许多个进程同时读取文件。
- 独占锁(write lock):只允许一个进程写入文件。
可以使用flock()
或fcntl()
进行文件锁定。
6. 目录操作
除了普通文件,Linux还支持目录操作。常用的目录操作函数包括:
opendir()
: 打开目录。readdir()
: 读取目录中的条目。closedir()
: 关闭目录。
7. 文件权限与所有权
Linux文件系统具有严格的权限控制。每个文件都有所有者、组和其他用户的权限,可以通过chmod
、chown
等命令进行管理。
8. 文件系统
Linux支持多种文件系统,如ext4、XFS、Btrfs等。每种文件系统都有其特定的特点和优缺点,适合不同的使用场景。
9. 异步I/O
Linux还支持异步I/O(AIO),允许程序在进行I/O操作时继续执行其他任务,而不必等待I/O操作完成。可以使用aio_read()
和aio_write()
函数实现异步I/O。
例子1. 文件的创建与写入
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main() {int fd;const char *text = "Hello, Linux File I/O!\n";// 创建并打开文件fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);if (fd == -1) {perror("Error opening file");return 1;}// 写入数据write(fd, text, strlen(text));// 关闭文件close(fd);return 0;
}
例子2. 文件的读取
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>int main() {int fd;char buffer[100];ssize_t bytesRead;// 打开文件fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("Error opening file");return 1;}// 读取数据bytesRead = read(fd, buffer, sizeof(buffer) - 1);if (bytesRead == -1) {perror("Error reading file");close(fd);return 1;}// 添加字符串结束符buffer[bytesRead] = '\0';// 打印读取的数据printf("Read from file: %s", buffer);// 关闭文件close(fd);return 0;
}
例子3. 追加写入文件
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main() {int fd;const char *text = "Appending this line.\n";// 以追加模式打开文件fd = open("example.txt", O_WRONLY | O_APPEND);if (fd == -1) {perror("Error opening file");return 1;}// 追加写入数据write(fd, text, strlen(text));// 关闭文件close(fd);return 0;
}
例子4. 目录操作示例
#include <stdio.h>
#include <dirent.h>int main() {DIR *dir;struct dirent *entry;// 打开当前目录dir = opendir(".");if (dir == NULL) {perror("Error opening directory");return 1;}// 读取目录项while ((entry = readdir(dir)) != NULL) {printf("Found file: %s\n", entry->d_name);}// 关闭目录closedir(dir);return 0;
}
例子5. 文件锁定示例
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main() {int fd;struct flock lock;// 打开文件fd = open("example.txt", O_WRONLY);if (fd == -1) {perror("Error opening file");return 1;}// 初始化锁lock.l_type = F_WRLCK; // 写锁lock.l_whence = SEEK_SET;lock.l_start = 0;lock.l_len = 0; // 锁定整个文件// 加锁if (fcntl(fd, F_SETLK, &lock) == -1) {perror("Error locking file");close(fd);return 1;}// 写入数据const char *text = "This is a locked write.\n";write(fd, text, strlen(text));// 解锁lock.l_type = F_UNLCK;fcntl(fd, F_SETLK, &lock);// 关闭文件close(fd);return 0;
}
在Linux中,如果要对其他目录中的文件进行I/O操作,只需在文件路径中指定完整的路径名。
1. 在其他目录中创建和写入文件
假设你想在/tmp
目录下创建一个文件并写入数据,可以这样做:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main() {int fd;const char *text = "Hello, Linux File I/O in /tmp!\n";// 创建并打开/tmp目录下的文件fd = open("/tmp/example.txt", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);if (fd == -1) {perror("Error opening file");return 1;}// 写入数据write(fd, text, strlen(text));// 关闭文件close(fd);return 0;
}
2. 从其他目录读取文件
如果要从/tmp
目录读取文件,可以使用类似的方式:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>int main() {int fd;char buffer[100];ssize_t bytesRead;// 打开/tmp目录下的文件fd = open("/tmp/example.txt", O_RDONLY);if (fd == -1) {perror("Error opening file");return 1;}// 读取数据bytesRead = read(fd, buffer, sizeof(buffer) - 1);if (bytesRead == -1) {perror("Error reading file");close(fd);return 1;}// 添加字符串结束符buffer[bytesRead] = '\0';// 打印读取的数据printf("Read from file: %s", buffer);// 关闭文件close(fd);return 0;
}
3. 追加写入其他目录的文件
如果需要在/tmp/example.txt
中追加数据,可以这样操作:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main() {int fd;const char *text = "Appending this line to /tmp/example.txt.\n";// 以追加模式打开/tmp目录下的文件fd = open("/tmp/example.txt", O_WRONLY | O_APPEND);if (fd == -1) {perror("Error opening file");return 1;}// 追加写入数据write(fd, text, strlen(text));// 关闭文件close(fd);return 0;
}
4. 处理文件路径中的空格和特殊字符
如果文件路径中包含空格或特殊字符,可以使用转义字符或用引号括起来。例如:
// 假设文件路径为 "/tmp/my file.txt"
fd = open("/tmp/my\\ file.txt", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
或者:
fd = open("\"/tmp/my file.txt\"", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
相关文章:
linux下文件读写操作
Linux下,文件I/O是操作系统与文件系统之间进行数据传输的关键部分。文件I/O操作允许程序读取和写入文件,管理文件的打开、关闭、创建和删除等操作。 1. 文件描述符 在Linux中,每个打开的文件都由一个文件描述符来表示。文件描述符是一个非负…...
命名管道的创建和通信实现
目录 命名管道的创建 使用函数创建命名管道的通信 预备创建 makefile设计 server.hpp设计 clent.hpp设计 comm.hpp设计 server.cc设计 clent.cc设计 测试运行 今天我们来学习命名管道 由于匿名管道(pipe())无法在两个毫不相干的进程之间进行通…...
C++和OpenGL实现3D游戏编程【连载24】——父物体和子物体之间的坐标转换
欢迎来到zhooyu的C++和OpenGL游戏专栏,专栏连载的所有精彩内容目录详见下边链接: 🔥C++和OpenGL实现3D游戏编程【总览】 父子物体的坐标转换 1、本节要实现的内容 前面章节我们了解了父物体与子物体的结构,它不仅能够表示物体之间的层次关系,更重要的一个作用就是展示物…...
21.HarmonyOS Next CustomSlider组件步长控制教程(三)
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 文章目录 1. 步长控制概述2. 步长基本概念2.1 什么是步长?2.2 步长的作用 3. 设置步长3.1 基本参数3.2 代码示例 4. 步长与范围的关系4…...
小白学习:rag向量数据库
学习视频: https://www.bilibili.com/video/BV11zf6YyEnT/?spm_id_from333.337.search-card.all.click 例子: 用户提出问题 客服机器人基于rag回答用户问题 过程拆解: 客户问题 – 转化为向量表示 – 在向量数据库中进行相似性搜索 – 系…...
STM32 CAN模块原理与应用详解
目录 概述 一、CAN模块核心原理 1. CAN协议基础 2. STM32 CAN控制器结构 3. 波特率配置 二、CAN模块配置步骤(基于HAL库) 1. 初始化CAN外设 2. 配置过滤器 3. 启动CAN通信 三、数据收发实现 1. 发送数据帧 2. 接收数据帧(中断方式…...
NO.29十六届蓝桥杯备战|string九道练习|reverse|翻转|回文(C++)
P5015 [NOIP 2018 普及组] 标题统计 - 洛谷 #include <bits/stdc.h> using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);string s;getline(cin, s);int sz s.size();int cnt 0;for (int i 0; i < sz; i){if (isspace(s[i]))continue…...
最新版本TOMCAT+IntelliJ IDEA+MAVEN项目创建(JAVAWEB)
前期所需: 1.apache-tomcat-10.1.18-windows-x64(tomcat 10.1.8版本或者差不多新的版本都可以) 2.IntelliJ idea 24年版本 或更高版本 3.已经配置好MAVEN了(一定先配置MAVEN再搞TOMCAT会事半功倍很多) 如果有没配置…...
MAC-禁止百度网盘自动升级更新
通过终端禁用更新服务(推荐) 此方法直接移除百度网盘的自动更新组件,无需修改系统文件。 步骤: 1.关闭百度网盘后台进程 按下 Command + Space → 输入「活动监视器」→ 搜索 BaiduNetdisk 或 UpdateAgent → 结束相关进程。 2.删除自动更新配置文件 打开终端…...
Unity DOTS从入门到精通之EntityCommandBufferSystem
文章目录 前言安装 DOTS 包ECBECB可以执行的指令示例: 前言 DOTS(面向数据的技术堆栈)是一套由 Unity 提供支持的技术,用于提供高性能游戏开发解决方案,特别适合需要处理大量数据的游戏,例如大型开放世界游…...
【AIGC系列】6:HunyuanVideo视频生成模型部署和代码分析
AIGC系列博文: 【AIGC系列】1:自编码器(AutoEncoder, AE) 【AIGC系列】2:DALLE 2模型介绍(内含扩散模型介绍) 【AIGC系列】3:Stable Diffusion模型原理介绍 【AIGC系列】4࿱…...
【Linux】使用问题汇总
#1 ssh连接的时候报Key exchange failed 原因:服务端版本高,抛弃了一些不安全的交换密钥算法,且客户端版本比较旧,不支持安全性较高的密钥交换算法。 解决方案: 如果是内网应用,安全要求不这么高…...
nnUNet V2修改网络——全配置替换MultiResBlock模块
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 MultiRes Block 是 MultiResUNet 中核心组件之一,旨在解决传统 U-Net 在处理多尺度医学图像时的局…...
Git合并工具在开发中的使用指南
在团队协作开发中,Git 是最常用的版本控制工具,而代码合并(Merge)是多人协作不可避免的环节。当多个开发者同时修改同一文件的相同区域时,Git 无法自动完成合并,此时需要借助合并工具(Merge Too…...
AutoDL平台租借GPU,创建transformers环境,使用VSCode SSH登录
AutoDL平台租借GPU,创建transformers环境,使用VSCode SSH登录 一、AutoDl平台租用GPU 1.注册并登录AutoDl官网:https://www.autodl.com/home 2.选择算力市场,找到需要的GPU: 我这里选择3090显卡 3.这里我们就选择P…...
listen EACCES: permission denied 0.0.0.0:811
具体错误 npm run serve> bige-v0.0.0 serve > viteThe CJS build of Vites Node API is deprecated. See https://vitejs.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated for more details. error when starting dev server: Error: listen EACCES: per…...
OpenAI API模型ChatGPT各模型功能对比,o1、o1Pro、GPT-4o、GPT-4.5调用次数限制附ChatGPT订阅教程
本文包含OpenAI API模型对比页面以及ChatGPT各模型功能对比表 - 截至2025最新整理数据:包含模型分类及描述;调用次数限制; 包含模型的类型有: Chat 模型(如 GPT-4o、GPT-4.5、GPT-4)专注于对话,…...
六十天前端强化训练之第十五天React组件基础案例:创建函数式组件展示用户信息(第15-21天:前端框架(React))
欢迎来到编程星辰海的博客讲解 我们已经学了14天了,再坚持坚持,马上我们就可以变得更优秀了,加油,我相信大家,接下来的几天,我会给大家更新前端框架(React),看完可以给一…...
北大一二三四版全套DeepSeek教学资料
DeepSeek学习资料合集:https://pan.quark.cn/s/bb6ebf0e9b4d DeepSeek实操变现指南:https://pan.quark.cn/s/76328991eaa2 你是否渴望深入探索人工智能的前沿领域?是否在寻找一份能引领你从理论到实践,全面掌握AI核心技术的学习…...
计算机网络:计算机网络的组成和功能
计算机网络的组成: 计算机网络的工作方式: 计算机网络的逻辑功能; 总结: 计算机网络的功能: 1.数据通信 2.资源共享 3.分布式处理:计算机网络的分布式处理是指将计算任务分散到网络中的多个节点(计算机或设备&…...
管理网络安全
防火墙在 Linux 系统安全中有哪些重要的作用? 防火墙作为网络安全的第一道防线,能够根据预设的规则,对进出系统的网络流量进行严格筛选。它可以阻止未经授权的外部访问,只允许符合规则的流量进入系统,从而保护系统免受…...
音频进阶学习十九——逆系统(简单进行回声消除)
文章目录 前言一、可逆系统1.定义2.解卷积3.逆系统恢复原始信号过程4.逆系统与原系统的零极点关系 二、使用逆系统去除回声获取原信号的频谱原系统和逆系统幅频响应和相频响应使用逆系统恢复原始信号整体代码如下 总结 前言 在上一篇音频进阶学习十八——幅频响应相同系统、全…...
Redis7系列:设置开机自启
前面的文章讲了Redis和Redis Stack的安装,随着服务器的重启,导致Redis 客户端无法连接。原来的是Redis没有配置开机自启。此文记录一下如何配置开机自启。 1、修改配置文件 前面的Redis和Redis Stack的安装的文章中已经讲了redis.config的配置…...
word甲烷一键下标
Sub 甲烷下标()甲烷下标 宏Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find.Text "CH4".Replacement.Text "CHguoshao4".Forward True.Wrap wdFindContinue.Format False.MatchCase False.MatchWhole…...
SSH 连接中主机密钥验证失败问题的解决方法
问题描述 在尝试通过 SSH 建立连接时,出现以下错误信息: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack…...
网络安全工具nc(NetCat)
NetCat是一个非常简单的Unix工具,可以读、写TCP或UDP网络连接(network connection)。它被设计成一个可靠的后端(back-end)工具,能被其它的程序程序或脚本直接地或容易地驱动。同时,它又是一个功能丰富的 网络调试和开发工具,因为它…...
探索在生成扩散模型中基于RAG增强生成的实现与未来
概述 像 Stable Diffusion、Flux 这样的生成扩散模型,以及 Hunyuan 等视频模型,都依赖于在单一、资源密集型的训练过程中通过固定数据集获取的知识。任何在训练之后引入的概念——被称为 知识截止——除非通过 微调 或外部适应技术(如 低秩适…...
【Linux】37.网络版本计算器
文章目录 1. Log.hpp-日志记录器2. Daemon.hpp-守护进程工具3. Protocol.hpp-通信协议解析器4. ServerCal.hpp-计算器服务处理器5. Socket.hpp-Socket通信封装类6. TcpServer.hpp-TCP服务器框架7. ClientCal.cc-计算器客户端8. ServerCal.cc-计算器服务器9. 代码时序1. 服务器启…...
3.6c语言
#define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <stdio.h> int main() {int sum 0,i,j;for (j 1; j < 1000; j){sum 0;for (i 1; i < j; i){if (j % i 0){sum i;} }if (sum j){printf("%d是完数\n", j);}}return 0; }#de…...
【 IEEE出版 | 快速稳定EI检索 | 往届已EI检索】2025年储能及能源转换国际学术会议(ESEC 2025)
重要信息 主会官网:www.net-lc.net 【论文【】投稿】 会议时间:2025年5月9-11日 会议地点:中国-杭州 截稿时间:见官网 提交检索:IEEE Xplore, EI Compendex, Scopus 主会NET-LC 2025已进入IEEE 会议官方列表!&am…...
JVM常用概念之本地内存跟踪
问题 Java应用启动或者运行过程中报“内存不足!”,我们该怎么办? 基础知识 对于一个在本地机器运行的JVM应用而言,需要足够的内存来存储机器代码、堆元数据、类元数据、内存分析等数据结构,来保证JVM应用的成功启动以及未来平…...
JVM 的主要组成部分及其作用?
创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家! JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执…...
从能耗监测到碳资产管理:智慧校园能源管理平台的迭代升级与实践启示
一、核心价值提炼 随着我国能源结构转型的持续优化和“双碳”目标的明确,构建现代化能源体系已成为国家发展的重要战略。在这一背景下,校园作为能源消耗的重要领域,其能源管理的智能化、绿色化转型显得尤为重要。本文将深入探讨校园智慧能源…...
数据库核心-redo、undo
一、redo日志 InnoDB操作以页为单位操作数据。并且首先操作内存中缓冲池的数据,然后刷新到disk中,但如果事务提交后宕机、未能刷新到disk中,就会造成不一致情况。 重做日志: 系统重启时按照修改步骤重新更新数据页 redo日志占用…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_core_module
定义在 src\core\nginx.c ngx_module_t ngx_core_module {NGX_MODULE_V1,&ngx_core_module_ctx, /* module context */ngx_core_commands, /* module directives */NGX_CORE_MODULE, /* module type */NULL…...
SQLAlchemy系列教程:如何执行原生SQL
Python中的数据库交互提供了高级API。但是,有时您可能需要执行原始SQL以提高效率或利用数据库特定的特性。本指南介绍在SQLAlchemy框架内执行原始SQL。 在SQLAlchemy中执行原生SQL SQLAlchemy虽然以其对象-关系映射(ORM)功能而闻名ÿ…...
怎么实现: 大语言模型微调案例
怎么实现: 大语言模型微调案例 目录 怎么实现: 大语言模型微调案例输入一个反常识的问题:首都在北京天安门之后对输出模型进行测试:首都在北京天安门微调代码:测试微调模型代码:微调输出模型结构输出模型参数大小对比Qwen 2.5_0.5:53MB输出模型:951MB 是一样的,没有进行…...
【Linux内核系列】:深入理解缓冲区
🔥 本文专栏:Linux 🌸作者主页:努力努力再努力wz ★★★ 本文前置知识: 文件系统以及相关系统调用接口 输入以及输出重定向 那么在此前的学习中,我们了解了文件的概念以及相关的系统调用接口,并…...
【Qt】成员函数指针
一、成员函数指针的本质 与普通函数指针的区别: // 普通函数指针 void (*funcPtr)() &普通函数;// 成员函数指针 void (MyClass::*memberFuncPtr)() &MyClass::成员函数;• 绑定对象:成员函数指针必须与类的实例对象结合使用 • 隐含 this 指…...
关于 Can Utils 的详细介绍、使用方法及配置指南
Can Utils:开源CAN总线工具集合 一、Can Utils简介 Can Utils 是一组开源的CAN总线工具链,专为嵌入式开发者和网络诊断工程师设计,支持Linux、Windows和macOS系统。它包含一系列轻量级命令行工具(如 cantoolz、candump、canbus …...
【Academy】OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities
OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities 1. 什么是 OAuth?2. OAuth 2.0 是如何工作的?3. OAuth 授权类型3.1 OAuth 范围3.2 授权代码授权类型3.3 隐式授权类型 4. OAuth 身份验证4.1 识别 OAuth 身份验证4.2 侦察OAuth…...
dify中使用NL2SQL
在 Dify 工作流中融入 NL2SQL(自然语言转 SQL)之能力,可依循如下步骤达成,借由 Dify 的模块化设计以及模型编排之功能,优化数据库查询之智能化交互: 一、环境准备与 Dify 部署 安装 Docker 与 Dify 务须确…...
android viewmodel如何使用
嗯,我现在要学习如何在Android中使用ViewModel。我之前听说过ViewModel是用来管理UI相关数据的,这样在配置变化比如屏幕旋转时数据不会丢失。但具体怎么用呢?我需要先回忆一下相关的知识。 首先,ViewModel应该是Android Architec…...
蓝桥杯备赛-基础训练(四)字符串 day17
好久不见,今天开始继续更新,或许拿不了奖,但是希望记录自己学习的过程,如果感觉有收获的同学在下面多多评论说说我代码的缺陷,感谢大家! 1、反转字符串 编写一个函数,其作用是将输入的字符串反…...
AI Agent开发框架分析:前端视角
1. Mastra (https://mastra.ai/docs) 优点: 提供直观的界面构建器,适合无代码/低代码开发支持JavaScript/TypeScript,可直接集成到前端项目可视化工作流设计,降低入门门槛内置多种UI组件,加速前端开发 缺点…...
第3节:IP地址分类与子网划分实战指南
IP地址分类与子网划分实战指南:从小白到入门 在网络通信中,IP地址是设备之间相互识别和通信的基础。无论是家庭网络还是企业网络,IP地址的分配和管理都是网络运维的核心任务之一。然而,对于初学者来说,IP地址的分类、子网掩码、CIDR(无类别域间路由)和VLSM(可变长子网…...
贪心算法三
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是贪心算法,并且掌握贪心算法。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! >…...
pytest基础知识
pytest知识了解 pytest的基础知识了解:Python测试框架之pytest详解_lovedingd的博客-CSDN博客_pytest框架 (包含设置断点,pdb,获取最慢的10个用例的执行耗时) pytest-pytest.main()运行测试用例,pytest参数: pytest-…...
JavaWeb后端基础(7)AOP
AOP是Spring框架的核心之一,那什么是AOP?AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。AOP是一种思想,而在Spring框…...
[AI]从零开始的ComflyUI安装教程
一、前言 AI画图如今已经进化到了让人难以想象的地步。早在2022年各大视频网站上就出现了许多真人使用AI绘制二次元形象的视频。在那个时期,也有人凭借AI画图狠狠的吃到了一波AI红利。在现在,对于普通人来说,AI画图仍然是非常值得探索的。不管…...