【IO】文件操作
🥰🥰🥰来都来了,不妨点个关注叭!
👉博客主页:欢迎各位大佬!👈
文章目录
- 1. 文件
- 1.1 认识文件
- 1.2 分清操作的是内存还是硬盘
- 1.3 路径
- 1.3.1 目录结构
- 1.3.2 相对和绝对路径
- 1.4 文本文件和二进制文件
- 1.4.1 含义
- 1.4.2 区分
- 2. 文件系统操作
- 2.1 构造 File 对象
- 2.2 File 提供的方法
- 3. 文件内容操作
- 3.1 分类
- 3.2 字节流 —— InputStream和OutputSream的使用方法
- 3.3 try with resources 用法
- 3.4 字符流 —— Reader和Writer的使用方法
- 3.5 如何实现读一行
1. 文件
1.1 认识文件
平时谈到的"文件",指的都是硬盘上的文件
【知识回顾】
硬盘(外存) 与 内存相比,从如下4个方面对比:
1)速度:内存比硬盘快很多
2)空间:内存空间比硬盘小
3)成本:内存比硬盘贵(随着时代的发展,目前内存也不算太贵啦)
4)持久化:内存掉电后数据丢失,硬盘掉电后数据仍在
1.2 分清操作的是内存还是硬盘
回顾我们之前写的代码,绝大部分都是围绕内存展开的,比如定义一个变量,其实就是在内存上申请空间,MySQL主要是操作硬盘
【IO】指的是输入和输出,I 是 input,O 是 output
文件IO 这里也是操作硬盘~ 有两种操作,如下:
1)文件系统操作:创建文件,删除文件,重命名文件,创建目录等等
2)文件内容操作:针对文件的内容进行读和写
1.3 路径
【路径】即文件系统上一个文件/目录,具体的位置
目录 ==> 文件夹 (目录,即文件夹)
目录 —— 计算机专业人士,专业术语
文件夹 —— 通俗的说法(我们经常说的~)
1.3.1 目录结构
计算机的目录是层级结构,文件系统是以树型结构来组织文件和目录的,是N叉树,如下图所示:
从上图可以看到,文件路径,就是从树根节点出发,沿着树杈,一路往下走,到达目标文件,此时这个中间经过的内容
1.3.2 相对和绝对路径
Windows 都是从"此电脑" 开始的,表示路径时,可以把 “此电脑” 省略,直接从盘符开始表示
实际表示路径如下:
D:\QQ\Misc\QQApp
实际表示路径,是通过一个字符串表示,每个目录之间使用 \ (反斜杠) 或者 / (斜杆)
(注意:\ 反斜杠只是在Windows中适用,代码中需要写成 \ 需要转义,所有在代码中最好用 / 斜杠表示)
【绝对路径】从盘符开始,一层一层往下找,这个过程中得到的路径为绝对路径
【相对路径】从给定的某个目录出发,一层一层往下找,找得这个过程得到的路径为相对路径
注意!!! 相对路径一定要明确工作目录,即基准目录什么!!!
在具体一点来说儿~ 工作目录就是项目所在的目录,写相对路径就是以工作目录/基准目录为基准来展开的!!!
举个栗子,比如我要找一碗热干面,
我可以从宇宙出发,进行寻找,一直找宇宙 ——> 地球 ——> 中国 ——> 湖北 ——> 武汉… 找到热干面,这是绝对路径
我也可以直接从中国出发,一直找中国 ——> 湖北 ——> 武汉…找到热干面,这是相对路径
【路径举例】
要找到USBCoInstaller.dill,绝对路径如下:
1)假设工作目录如下:
此时找到USBCoInstaller.dill 相对路径的表示:./32/USBCoInstaller.dill
2)假设工作目录如下:
此时找到USBCoInstaller.dill 相对路径的表示:./adbdrv/32/USBCoInstaller.dill
3)假设工作目录如下:
此时找到USBCoInstaller.dill 相对路径的表示:./LEmu/adbdrv/32/USBCoInstaller.dill
【补充说明】
文件系统上,任何一个文件对应的路径是唯一的!!! 不会存在两个路径相同,但是文件不一样的情况
1)在Windows 系统上可以认为,路径和文件是一一对应的,路径就相当于一个文件的"身份标识",具有唯一性
2)在Linux 系统上,可能存在一个文件,有两个不同的路径能找到该文件
【总结】
关于路径,是非常关键的~后面很多地方会涉及到路径,尤其是相对路径,相对路径一定要明确工作目录(基准目录)是什么,两者相比之下,绝对路径就可以理解成以"此电脑"为工作路径
1.4 文本文件和二进制文件
1.4.1 含义
【文本文件】
存储的都是文本,文本文件内容都是由ASCII字符构成的,以下是ASCII字符表部分展示:
对于ASCII而言,表示范围0-127,随着时代发展,又有了其它的编码方式,如 utf8 之类的,就可以针对其它语言的文字符号进行编码,utf8 可以想象成一个更大的表,但是终究是有限的!
文本文件存储的数据就是遵守ASCII或者其它字符集编码,所得到的文件,本质上存的是字符,不仅仅是所说的char!!!
【二进制文件】
存储的是二进制数据,没有任何字符集的限制,存什么都是可以的,不受限制!!!
1.4.2 区分
最简单粗暴的方式:直接使用记事本打开某个文件,通过其内容判断
如果能看懂这个文件,则是文本文件,
如果是一大堆乱码,看不懂的,则是二进制文件
(为什么会出现乱码,因为二进制都是一个个字节,记事本尝试把当前若干个字节的数据我那个 utf8 里面套,套出来是什么就是什么,套不出来的就是方块)
【常见的文本文件】
1).txt
2).java
3).c
【常见的二进制文件】
1).exe
2).jpg
3).mp3
4).docx
5).excel
如图所示,.java文件被记事本打开是可以看懂的内容,比如这些是导入包的代码语句,.java是文本文件
如图所示,.docx 文件被记事本打开是一大堆乱码,完全看不懂的内容,.docx 是二进制文件
2. 文件系统操作
文件系统操作,我们需要了解是怎么操作的,文件是存储在硬盘上的,直接通过代码操作硬盘,不是很方便,就在内存中创建一个对应的对象,通过操作这个内存中的对象,就可以间接影响到硬盘的文件情况~
所以,Java 标准库给我们提供了 File 这个类,File 对象是硬盘上的一个文件"抽象"的表示,通过代码对 File 对象的操作,间接影响硬盘的文件内容
打个形象的比方,这里的 File 对象相当于遥控器,我们可以通过控制遥控器,即通过代码操作 File 对象,来间接控制电视频道,即间接控制硬盘的文件
2.1 构造 File 对象
File类构造方法如下:
其中,最常用的还是第2种,构造的过程中,可以使用绝对路径/相对路径 进行初始化
注意:这个路径指向的文件,可以是真实存在的,也可以是不存在的!!! 这里是不受限制的~
创建 File 对象,需要导入该包
import java.io.File;
具体创建 File 对象过程如下:
public class IODemo {public static void main(String[] args) throws IOException {File file = new File("d:/student.txt"); //这里可以是相对路径,也可以是绝对路径}
}
2.2 File 提供的方法
这些方法,我们一看名字,就知道怎么用,很容易理解,不需要去记,在实践中掌握就可以啦~ 忘记或者不会的,查查就可以!
其中需要注意的是:
【Q】如果输入的路径,文件不存在,系统会自动创建一个文件吗?
【A】并不会,只有手动调用 createNewFile() 方法,才可以创建文件(注意文件是文件,目录是目录,区分开来!!!)
下面,我们进行代码的演示,以熟悉上述操作:
1)前面五种操作,返回值均为 boolean 类型
public class IODemo1 {public static void main(String[] args) throws IOException {File file = new File("d:/student.txt");System.out.println(file.getParent());System.out.println(file.getName());System.out.println(file.getPath());System.out.println(file.getAbsoluteFile());System.out.println(file.getCanonicalFile());}
}
打印结果如下:
2)接下来的五种操作
public class IODemo2 {public static void main(String[] args) throws IOException {File file = new File("./hello world.txt");System.out.println(file.exists());System.out.println(file.isDirectory());System.out.println(file.isAbsolute());//创建文件file.createNewFile();System.out.println(file.exists());System.out.println(file.isDirectory());System.out.println(file.isFile());//删除文件之后file.delete();System.out.println(file.exists());}
}
打印结果如下:
3)创建目录
public class IODemo3 {public static void main(String[] args) {File file = new File("test-dir/aaa/bbb");//只能创建1个目录//file.mkdir();//创建多级目录file.mkdirs();}
}
打印结果如下:可以在左侧看到,文件夹test-dir,创建了多级目录
4)罗列目录下的内容
public class IODemo4 {public static void main(String[] args) {File file = new File("test-dir");//罗列目录下的内容String[] result1 = file.list();System.out.println(Arrays.toString(result1));File[] result2 = file.listFiles();System.out.println(Arrays.toString(result2));}
}
打印结果如下:
5)修改文件名字
public class IODemo5 {public static void main(String[] args) {File src = new File("./test-dir");File dest = new File("./test123");src.renameTo(dest);}
}
打印结果如下:
以上是 File 类方法的一些基本操作演示,通过这些案例,我们更够更加熟悉叭~
3. 文件内容操作
3.1 分类
文件内容操作,提供了很多类,一组类,进行操作,分为两类
1)针对文本文件,提供了一组类,统称为"字符流"
典型代表:Reader,Writer 读写的基本单位是 字符
2)针对二进制文件,提供了一组类,统称为"字节流"
典型代表,InputStream,OutputSream 读写的基本单位是 字节
这里出现了一个"新"字 ——> “流”(stream)
比如在生活中,水流~ 从水龙头接水,假如让你接 1000ml 的水,你的接法有很多种,
<1> 一次性接完 1000ml 的水
<2> 一次接 500ml,分两次接完
<3> 一次接 200ml,分五次接完
…
字节流
假如让你从文件读取 1000 个字节的数据,你的读法也可以有很多种
<1> 一次性读完 1000 字节的数据
<2> 一次读 500 字节的数据,分两次读完
<3> 一次接 200 字节的数据,分五次接完
每种流对象,分为两种:
输入的:Reader,InputStream
输出的:Writer,OutputStream
【注意】一定要认清输入输出的方向!!! 以下面示意图,更加明确输入和输出的方向:
3.2 字节流 —— InputStream和OutputSream的使用方法
InputStream 用来进行 IO,IO 不仅仅可以读写硬盘的文件,还可以读写别的,如后面学习到网络编程,可以知道IO 还能用来读网卡
初步认识一下 InputStream,是抽象类,不能直接实例化!!!
使用方法:
InputStream inputStream = new FileInputStream(指定当前要读的一个文件路径);
【重点——关闭操作】
同时一定要记得一个操作:关闭操作!!!
inputStream.close();
这个操作非常重要!在C++中,主要是一个手动释放资源,包括内存,Java中有GC,内存一般不需要手动释放,但是在这里文件的资源,则需要手动释放!
(垃圾回收(GarbageCollection,GC),它的主要作用是回收程序中不再使用的内存)
【这里文件的资源指的是什么呢?】
主要指的是"文件描述符",这里回顾一下前面讲解进程时候,提到进程是使用 PCB 这样的结构来表示的,
其中PCB中的属性有: 1)pid 2)内存指针 3)进程调度信息4) 文件描述符表
文件描述符表记载了当前进程都打开了哪些文件,每次打开一个文件都在这个表里申请到一个位置,这个表可以当做一个数组,数组下标就是文件描述符,数组元素就是这个文件在内核中结构体的表示,但是这个表的长度是有限的,不能无休止的打开而不进行释放,一旦满了,继续打开,就会打开失败,造成文件资源泄露的问题,这个问题是十分严重的!!!
public class IODemo {public static void main(String[] args) throws IOException {//这个过程就是相当于C中的fopen 文件的打开操作//让这个当前变量和硬盘的文件相关联起来InputStream inputStream = new FileInputStream("d:/student.txt"); //...//进行读的操作 //关闭操作很重要!!inputStream.close();}
}
但是这样写 如果执行中间出现一些问题 比如return 或者 抛出异常,close就执行不到了,是十分危险的
既然这样,我们要确保close()方法执行到,可以进行如下修改:
public class IODemo {public static void main(String[] args) throws IOException {InputStream inputStream = null;try {inputStream = new FileInputStream("d:/student.txt");//...//进行读的操作} finally {inputStream.close();}}
}
但是上述代码写法是不优雅的~ 代码也要讲究美观性呀,下面介绍try with resources 用法,使代码"漂亮"起来,即更加简洁起来!
同理,OutputSream的用法如下:
OutputStream outputStream = new FileOutputStream(指定当前要读的一个文件路径);
3.3 try with resources 用法
【try with resources】是一个异常处理机制,它的作用是解决使用 try-catch 语句时可能遇到的代码重复和繁琐问题,该机制可以确保即使在抛出异常的情况下,也能将资源正确的关闭
【范围】try with resources 语句可以用于处理任何实现了java.lang.AutoCloseable接口的对象,这包括了所有IO 对象(如InputStream、OutputStream、Reader和Writer)、JDBC资源(如Connection、Statement)和Zip压缩文件(如ZipFile和ZipInputStream)
因为 InputStream 实现了一个特定的接口——> Closeable,充分利用该特点,带有资源的 try 操作,会在 try 代码块结束自动执行 close 关闭操作
inputStream 相当于遥控器,通过它调用 read() 对文件进行读取,有三种形式,如下:
1) read() 无参数,相当于一次读一个字节
2) read(byte[] b) 读多个字节,放在 byte[] 数组里面
3) read(byte[] b,int off,int len) 读多个字节,放在 byte[] 数组里面,限定起始位置和长度
【补充】这里可以看到,都是 int 接收,为啥不使用 short ?
我们可以把 short 忘记啦,看起来是节省了两个字节,但是显得很小气!!! 虽然 short 也实现内存对齐,但是没有 int来得快,short 和 float 都用得很少!!!
表示整数,一般都是 int 和 long
表示浮点数,一般都是 double
代码举例如下:
public class IODemo {public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("d:/student.txt")) {//读文件//read一次返回的是一个字节 但是此处的返回类型是int!!!while(true) {int b = inputStream.read();if(b == -1) {//读到末尾了break;}System.out.println(b);}}}
}
打印的结果如下:
【解释说明】
在此处读到的97、98、99,是因为使用的是字节流,每次读的不是字符,而是字节,读出的这些数据就是每个字符的ASCII码!!! a,b,c 对应的ASCII码正是97、98、99
如果student.txt 文件写的是汉字呢?结果将会是怎么样的呢~
重新运行程序,打印结果如下:
字符集!!! 2个汉字,6个字节(每个数字就是一个字节,上述程序运行结果有6个数字,即6个字节),每个汉字3个字节,很明显是utf8编码的~查询对应结果如下:
上述打印结果为10进制,是把3个字节放在一起,弄了一个大的十进制,和把3个字节分开打印是不一样的,把代码按照十六进制打印,更方便看清,与上图结果相对应
//转成16进制打印System.out.printf("%x\n",b);
utf8和unicode就可以视为两个不同的表,编号是不同的,即使是同一个符号(汉字)得到的数值是不一样的,uft8是基于unicode演化而来,写代码统一为utf8是最靠谱的做法!
这里是utf8查询转换链接
OutputStream 写入的举例代码,如下:
public class IODemo7 {public static void main(String[] args) {try(OutputStream outputStream = new FileOutputStream("d:/student.txt")) {outputStream.write(100);outputStream.write(101);outputStream.write(102);} catch(IOException e) {e.printStackTrace();}}
}
运行程序后,打开student.txt,ASCII值为100对应小写字母d,101对应e,102对应f,成功写入!
有一种很神奇的感觉,通过代码就能实现对文件的内容写入~ 还是很方便的!
3.4 字符流 —— Reader和Writer的使用方法
与字节流是类似的~
Reader 对应的 FileReader
Reader reader = new FileReader(指定当前要读的一个文件路径);
Writer 对应的FileWriter
Writer writer = new FileWriter(指定当前要读的一个文件路径);
read()方法来读 —— 一次读一个char或者char[]
write()方法来写 —— 一次写一个char 或者char[]或者String
举个栗子~
public class IODemo8 {public static void main(String[] args) {try(Reader reader = new FileReader("d:/student.txt")) {while(true) {int c = reader.read();if(c == -1) {break;}char ch = (char) c;System.out.println(ch);}}catch (IOException e) {e.printStackTrace();}}
}
打印结果如下,是对应的,读取成功!
3.5 如何实现读一行
使用Scanner 套就可以啦,不多说直接上代码!
public class IODemo8 {public static void main(String[] args) {File file = new File("d:/student.txt");try (Scanner sc = new Scanner(file)) {while(sc.hasNextLine()) {String line = sc.nextLine();System.out.println(line);}} catch (FileNotFoundException e) {e.printStackTrace();}}
}
打印结果如下:
💛💛💛本期内容回顾💛💛💛
✨✨✨本期内容到此结束啦~
相关文章:

【IO】文件操作
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 文件1.1 认识文件1.2 分清操作的是内存还是硬盘1.3 路径1.3.1 目录结构1.3.2 相对和绝对路径 1.4 文本文件…...

代码随想录算法训练营第74天:路径总结[1]
代码随想录算法训练营第74天:路径总结 A * 算法精讲 (A star算法) 卡码网:126. 骑士的攻击(opens new window) 题目描述 在象棋中,马和象的移动规则分别是“马走日”和“象走田”。现给定骑士的起始坐标和目标…...
用 Emacs 写代码有哪些值得推荐的插件
以下是一些用于 Emacs 写代码的值得推荐的插件: Ido-mode:交互式操作模式,它用列出当前目录所有文件的列表来取代常规的打开文件提示符,能让操作更可视化,快速遍历文件。Smex:可替代普通的 M-x 提示符&…...
自定义注解-手机号验证注解
注解 package com.XX.assess.annotation;import com.XX.assess.util.MobileValidator;import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*;/*** 手机号校验注解* author super*/ Retention(RetentionPolicy.RUNTIME) Targe…...
华为od-C卷200分题目5 -项目排期
华为od-C卷200分题目5 -项目排期 题目描述 项目组共有N个开发人员,项目经理接到了M个独立的需求,每个需求的工作量不同,且每个需求只能由一个开发人员独立完成,不能多人合作。 假定各个需求之间无任何先后依赖关系,请…...
如何使用Pip从Git仓库安装Python包:深入探索远程依赖管理
如何使用Pip从Git仓库安装Python包:深入探索远程依赖管理 Python的包管理工具Pip使得安装和管理Python库变得非常简单。有时,我们需要安装那些尚未发布到PyPI的包,或者想要尝试最新的开发版本。这时,可以直接从Git仓库安装包。本…...

计算机专业怎么选择电脑
现在高考录取结果基本已经全部出来了,很多同学都如愿以偿的进入到了计算机类专业,现在大部分同学都在为自己的大学生活做准备了,其中第一件事就是买电脑,那计算机类专业该怎么选择电脑呢? 计算机专业是个一类学科&…...
当前国内可用的docker加速器搜集 —— 筑梦之路
可用镜像加速器 以下地址搜集自网络,仅供参考,请自行验证。 1、https://docker.m.daocloud.io2、https://dockerpull.com3、https://atomhub.openatom.cn4、https://docker.1panel.live5、https://dockerhub.jobcher.com6、https://hub.rat.dev7、http…...

【腾讯内推】腾讯2025校招/青云计划/社招——长期有效
及时跟进进度,保证不让简历石沉大海! 涵盖NLP/CV/CG/ML/多模态/数据科学/多媒体等各方向! 定向匹配优质团队/竞争力薪酬/覆盖全球工作地点! 招聘对象: 本硕博:2024年1月-2025年12月毕业的同学 目前最热岗位: 技术研究-自然语言处理 技术研究-计算机视觉 …...
集群限流sentinel实践
参考: 集群模式 实践 集群流控规则 其中 用一个专门的 ClusterFlowConfig 代表集群限流相关配置项,以与现有规则配置项分开: // 全局唯一的规则 ID,由集群限流管控端分配. private Long flowId;// 阈值模式,默认&…...

Flutter-实现双向PK进度条
如何实现一个双向PK进度条 在Flutter应用中,进度条是一个非常常见的组件。而双向PK进度条则能够展示两个对立的数值,如对战中的双方得分对比等。本文将介绍如何实现一个具有双向PK效果的进度条,并支持竖直和斜角两种过渡效果。 1. 需求 我…...

unix高级编程系列之文件I/O
背景 作为linux 开发者,我们不可避免会接触到文件编程。比如通过文件记录程序配置参数,通过字符设备与外设进行通信。因此作为合格的linux开发者,一定要熟练掌握文件编程。在文件编程中,我们一般会有两类接口函数:标准…...
PySide(PyQt),记录最后一次访问文件的路径
1、在同目录下用文本编辑器创建JSON文件,命名为setting.json,并输入以下内容后保存: { "setting": { "last_file": [ "" ] } } 2、应用脚本: import json …...

wordpress企业网站模板免费下载
大气上档次的wordpress企业模板,可以直接免费下载,连注册都不需要,网盘就可以直接下载,是不是嘎嘎给力呢 演示 https://www.jianzhanpress.com/?p5857 下载 链接: https://pan.baidu.com/s/1et7uMYd6--NJEWx-srMG1Q 提取码:…...

[leetcode hot 150]第一百一十七题,填充每个节点的下一个右侧节点
题目: 给定一个二叉树: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。 初始状态下&#x…...
Docker 入门篇(十 一)-- 网络配置总结
Docker 容器技术的核心优势之一是其轻量级的虚拟化和隔离性,而 Docker 网络则是实现容器间以及容器与外界通信的关键。以下是对 Docker 网络的关键知识点的总结。 一、 Docker 网络概述 Docker 网络允许容器进行相互通信以及与外部网络的连接。Docker 提供了多种网…...
【Android面试八股文】Android 有哪些存储数据的方式?
在Android平台上,有多种方式可以存储数据,每种方式都适合不同类型的数据和使用场景。以下是主要的存储数据方式: SharedPreferences(轻量级数据存储): SharedPreferences是用于存储简单键值对数据的最简单方法,适合存储用户偏好设置、配置信息等。数据以XML文件形式存储…...
3. train_encoder_decoder.py
train_encoder_decoder.py #__future__ 模块提供了一种方式,允许开发者在当前版本的 Python 中使用即将在将来版本中成为标准的功能和语法特性。此处为了确保代码同时兼容Python 2和Python 3版本中的print函数 from __future__ import print_function # 导入标准库…...

Hyper-V克隆虚拟机教程分享!
方法1. 使用导出导入功能克隆Hyper-V虚拟机 导出和导入是Hyper-V服务器备份和克隆的一种比较有效的方法。使用此功能,您可以创建Hyper-V虚拟机模板,其中包括软件、VM CPU、RAM和其他设备的配置,这有助于在Hyper-V中快速部署多个虚拟机。 在…...

QDockWidget类详解
一.QDockWidget类概述 1.QDockWidget类 QDockWidget类提供了一个特殊的窗口部件,它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。 QDockWidget类提供了dock widget的概念,dock widget也就是我们熟悉的工具面板或者是工具窗口。Do…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...