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

文件操作和IO ——Java

初识文件

首先文件分为:
1.狭义的文件 – 保存在硬盘上的文件。
2.广义的文件 – 操作系统进行资源管理的一种机制。很多的软件/硬件资源,抽象成“文件”来进行表示。
(println => 控制台,scanner => 控制台的标准输入)
当前咋们主要谈的是 狭义的文件。

我们简单说说 硬盘 内存 cpu寄存器 分别在 存储空间 访问速度 成本 和持久化 上的不同点
在这里插入图片描述

其中硬盘分为 机械硬盘和 固态硬盘 ,固态硬盘(通常读写速度,1s几百GB)不管是速度还是价格都比机械硬盘(读写速度,1s几个MB)高上不少。

计算机中,目录套目录,构成了 树形结构(N叉树)
在这里插入图片描述

一台计算机中,能够保存的文件是很多的,那如何区分/识别唯一的一个文件呢? => 路径(定位到文件的一系列过程)
从树根开始,到最终的文件,中间都需要经历哪些目录,把这些目录记录下来,就够成“路径”。路径中一般使用 / (路径分隔符)来分割 路径中的多级目录。
在主流的操作系统中,都是使用 / 来分割的。但是 Windows 是例外。Windows / 和 \ 都支持(但是 Windows 默认使用 \)。
不过写代码的时候,涉及到路径,建议写成 / 。因为 写成 \ 早字符串中就需要转义的。
在这里插入图片描述

路径分为相对路径和绝对路径:
从树形结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描述,而这种描述方式就被称为文件的绝对路径;除了可以从根开始进行路径的描述,我们可以从任意节点出发,进行路径的描述,而这种描述方式就被称为相对路径,相对于当前所在结点的一条路径。(相对路径需要明确一个“基准路径”)
例:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

虽说谈到相对路径,要先明确基准路径。
但是如果在代码中写一个“相对路径”,那基准路径是谁呢??
在这里插入图片描述

在这里面中,基准路径是谁?不确定,这个取决于你程序允许的方式!
确认基准路径:
1.在 IDEA 中直接运行,基准路径就是项目的目录。
在这里插入图片描述

2.打一个 jar 包,单独运行 jar 包(后面说)
当前在哪个目录下执行运行命令(jar -jar jar包名),基准目录就是哪个目录。
3.如果是打成一个 war 包,放到 tomcat 中运行,此时基准目录就是tomcat的 bin 目录(未来再说)

文件的种类:

从开发的角度,把文件分为两类:
1.文本文件
2.二进制文件
(大前提,所有的文件都是二进制的(冯诺依曼大佬最初定下的规矩),但有一些文件是特殊的,二进制数据刚好能构成字符(不仅是ascii)== 二进制数据恰好都在码表上能够查到,并且翻译过来的字符能够构成有意义的信息。)
实际开发中判断某个文件是否是文本,有个简单粗暴的方法:
直接使用 记事本打开(记事本就是按照文本的方式来打开的,自动进行查码表,翻译),打开之后不是乱码,能看懂 ,就是文本文件,如果打开之后是乱码,看不懂,就是二进制文件。

Java中操作文件

Java标准库提供了一系列的类来操作文件:

  • 文件系统操作(创建文件,删除文件,重命名,创建目录…)
  • 文件内容操作(针对一个文件的内容进行读和写了)

文件系统操作:

Java 中通过 java.io.File 类来对⼀个⽂件(包括⽬录)进⾏抽象的描述。注意,有 File 对象,并不代表真实存在该⽂件。
我们来看看File 类常见的构造方法和方法:
构造方法:
在这里插入图片描述

常见方法:

在这里插入图片描述

代码示例:
案例1:
在这里插入图片描述
在这里插入图片描述

有个要注意的是,如果构造方法中传的路径是相对路径,那么getpath方法得到的就是相对路径,如果构造方法传的是绝对路径的话,那么getpath方法得到的就是绝对路径。
getCanonicalPath(会抛出异常)就是getAbsolutePath的简化版本,把路径中间的 . 或者 … 给干掉。

案例2:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

creatNewFile方法会抛出异常:
在这里插入图片描述

那啥样的情况会出现异常呢?
1.硬盘满了
2.没有权限
3.硬盘坏了(cpu和 内存 非常抗造的,硬盘相比之下就脆弱很多,尤其是机械硬盘)

案例3:
在这里插入图片描述
在这里插入图片描述

观察deletOnExit方法;
在这里插入图片描述
在这里插入图片描述

deleteOnExit 是等进程结束后再删除文件。

进程退出时删除文件的使用场景:
在 word,ppt,excel 做一些大作业时,当你写了很多内容,突然,你的电脑没电了,然后文档也没保存。但是当你再次打开word,word提示你是否要恢复上次未保存的内容。
office 系列的产品,都会在你编辑文档的过程中,产生一个 隐藏的临时文件,这个临时文件就会同步实时保存你正在编辑的内容。
如果你的office 正常关闭了,此时这个临时文件就会自动删除(deleteOnExit),下次启动office,认为你上次是正常保存的,不会提示。
如果office异常关闭(突然断电),这个临时文件就任然存在,下次启动 office ,就可以从这个临时文件中,恢复你上次正在编辑的内容
(类似于这样的功能,服务器端也会涉及到,一些临时性的文件)

案例4:
在这里插入图片描述
在这里插入图片描述

list 只是列出当前目录里面的子元素,无法列出子目录中的内容(也就是孙子元素)。
list得到是文件名(String)(不推荐),listFiles得到的是 File 对象,包含更多的操作。(推荐)

案例5:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注:mkdir无法创建多级目录,只能创建一级。
但mkdirs()可以解决这个问题,可以创建多级目录。

案例6:
在这里插入图片描述
在这里插入图片描述

重命名还能起到“移动”的作用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从操作系统的角度来看,重命名和移动操作本质是一样的,这个移动操作通常速度极快(如果你的移动操作 跨硬盘 了(不是跨C盘D盘这种),此时就相当于 复制 + 删除,此时的速度就慢了),复杂度O(1)。
复制文件,复杂度就是O(n)。文件/目录里所有的数据,遍历,再写入写的文件/目录。

文件内容操作:

读写文件
Java 中针对文件内容的操作,主要是通过一组“流对象”来实现的
那是什么是“流”?
在这里插入图片描述

因此,计算机中针对读写文件,也是使用 流(Stream)词。流是操作系统层面的术语,和语言无关。各种编程语言操作文件,都叫流。
Java中提供了一组类,表示 流。有几十个,很多,这里就讲几个重要的。

针对上述几十个流,分为两个大类:

  • 字节流:读写文件,以字节为单位,是针对二进制文件使用的。
    InputStream 输入 从文件读数据
    OutputStream 输出 往文件写数据
  • 字符流:读写文件,以字符为单位,是针对文本文件使用的。
    Reader 输入 从文件读数据
    Writer 输出 往文件写数据
    (字节 != 字符,一个字符可能是对应多个字节?? => 不确定,这个是取决于编码方式(字符集))
    Java中的其他流对象,都是直接或间接继承这些类。

什么叫输入,什么叫输出:
根据数据的流向:
从硬盘 => CPU 输入
从CPU => 硬盘 输出

InputStream

InputStream 只是⼀个抽象类,要使⽤还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输⼊设备都可以对应⼀个 InputStream 类,我们现在只关⼼从⽂件中读取,所以使⽤ FileInputStream。
在这里插入图片描述

FileInputStream的构造方法:

在这里插入图片描述

这里的创建对象操作,一旦成功,就相当于“打开文件”。类似C语言的 fopen。
毕竟,操作系统定义的流程,就是先打开,然后才能读写。认为 打开操作,就是根据文件路径,定位到对应的硬盘空间。
在这里插入图片描述

关闭文件操作。(非常重要)
类似内存一样,像C++,申请内存,释放内存(手动挡),对于Java,内存只要申请就行了,释放交给 GC 自动完成(自动档)。
但是文件资源不同于内存资源,虽然 GC 能够自动管理内存,但是不能自动管理文件,需要我们自己手动释放,如果不手动释放,就会引起“文件资源泄露”,类似于“内存泄漏”。
为了避免写代码的时候忘记写close方法,我们可以这样写代码:
在这里插入图片描述

但是,还有一个问题,上述代码有点繁琐,也就是有点“丑”。为了更进一步,我们可以用到 try with resources 语法来使代码更简洁一点。
在这里插入图片描述

只要出了 try 就会自动调用 close 方法。
当然,也不是所有类都能写到 try 的()内,这里要求这个类需要实现 Closable 接口。
在这里插入图片描述

约定好这个类一定有 close 方法,可以让 JVM 自动调用。

InputStream 的一些常用方法:
在这里插入图片描述

例子:
在这里插入图片描述
在这里插入图片描述

有的时候,这样写出的代码会报错,原因就是在该路径上没有此文件。
在这里插入图片描述

我们在demo文件中写个 “hello”,看看能打印出什么。
在这里插入图片描述

为什么呢?
因为read无参数版本,是按照字节读取的,一个一个字节取出来,分别打印的,每个字节的范围是 0 - 255 ,而 hello 是纯英文,根据 ASCII 码表,转换成10 进制。就是那5 个数字了。(十进制是正常的, 八进制是 0 开头,十六进制是 0x开头)
在这里插入图片描述

我们现在把demo文件换成“你好”,看看能打印出什么结果。
在这里插入图片描述

结果:
在这里插入图片描述

这是根据utf-8编码的,一个汉字是3个字节,所以“你好”就一个六个字节。
在这里插入图片描述

这样子看不吃来,我们把结果换成十六进制。(一个十六进制数字就是 4 bit ,两个 十六进制数字 就是 1个字节)
在这里插入图片描述

从上到下就是 ”你好“ 的十六进制编码。

接下来使用第二种read(byte[] b)方法
在这里插入图片描述

输出结果和上面是一样的
在这里插入图片描述

我们要提一下这一段代码:
在这里插入图片描述

这个代码是使用 参数作为方法的返回值,它在 C++中非常常见,但在Java中就比较少见了。它也被称为“输出型参数”。也就是刚创建的时候,我的数组是空的,n也为 0,但是通过read这个方法, data 和 n 上面就变成一些有意义的数据了。
有的时候也会使用参数来接受返回值,毕竟在Java中,如果参数是引用类型,方法内部修改对象内容,是能够影响到方法外部的。
其实,输出型参数,本质上还是语法上制约了我们的发挥。Java C++中,要求一个方法只能有一个返回值,如果希望返回多个数据(上述 read 就是希望同时返回 长度 和 数组内容)就只能通过参数来凑了,但同样的问题,在 Python ,GO是不存在的。都支持一个函数同时返回多个值。

OutputStream

OutputStream的一些常用方法:
在这里插入图片描述

注:
第一个write 的参数类型是 int 。为什么不是byte 呢?
因为 参数的取值范围是 0 - 255, 如果用 byte 类型, byte 的取值范围是 -128 -> 127,但是 Java中没有 unsigned 类型,byte类型就不能完全包含,所以就用int 了。

代码案例:
在这里插入图片描述
在这里插入图片描述

这中间关于 OutputStream 还有一个知识:
我们在上述代码,再多写几个 write,再看看 demo 文件内容会发生什么变化。
在这里插入图片描述

在这里插入图片描述

代码运行了两次,按照我们的期望来说,demo 文件中的内容应该是 abcabcdef ,但为什么只有 abcdef 呢?第一次的abc 去哪里了呢?
这是因为对于 OutputStream 来说,是会清除上次的文件内容的,打开文件的一瞬间,上次的文件就清空了。就像 C 语言中,按照写方式打开文件,也会有同样的特性,这是操作系统的行为,与语言无关。(而且对于 OutputStream 来说,默认情况下会尝试创建不存在的文件,也就是你给OutputStream 传的文件路径中,如果没有该文件没有创建,OutputStream 会自动创建该文件)
对于该问题,我们可以追加写的模式(也就是在传入一个参数true,默认情况是false),来避免内容被清空。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Reader(和 InputStream 一样,只不过适用的场景不同)

Reader 的常用方法:
在这里插入图片描述

代码案例:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注:
在这里插入图片描述

read 返回的相当于是一个 char,两个字节,所以上面的 “你”“好”分别是两个字节。但是这里就有一个问题了,砸门在前面使用字节流读取的时候,这里的“你”“好”都是 3 个字节。这里面是不是有什么问题呢?
其实,字符流和字节流的两个代码,都是对的,不矛盾的。字节流读到的是文件中原始的数据,在硬盘上保存文件的时候,就是 6 个字节,utf8 编码。字符流在读取的时候,就会根据文件的内容编码格式,进行解析,read()一次,就会读到3个字节(按照utf8解析的),返回的时候,针对3个字节进行转码了,拿着3个字节utf8的码表“你”汉字,read就把 “你”这个汉字在 Unicode 这个码表中再次查询了一次,得到Unicode的编码值,最终把 Unicode 的编码值返回到 char 变量中(两个字节)。
不过,这里会自动进行转码。转码也是有性能开销的,所以字节流比字符流快,确实也是毋庸置疑的。

Writer(和OutputStream一样)

Writer的常用方法:
在这里插入图片描述

代码案例(和OutputStream一样不清楚的可以参照OutputStream的案例):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

当然,和OutputStream一样,每次调用Writer 都会清除上次的文件内容。如果想要保存上次文件内容,也是多传入一个参数 true。

小小的总结一下:

1.流对象的使用流程
先打开,再读写,最后关闭。
2.应该使用哪个流对象?
先区分文件是文本文件还是二进制文件,再区分读还是写。

看到这,顺便再提一个别的小知识点 = 缓冲区
缓冲区,通常就是一段内存空间,他是用来提高程序的效率。
通常如果直接读写硬盘,是比较低效的(硬盘速度慢),因此有的时候,就希望减少读写文件的次数。因此在进行 IO 操作的时候,就希望能够使用缓冲区,把要写的数据,先放到缓冲区里攒一波,再一起写,或者读的时候,也不是一个一个的读,一次读一批数据,到缓冲区中,再慢慢解析。
当前 IO 流对象,read 和 write 就属于直接读文件了。要想要提高效率:
1.写代码的时候,手动创建缓冲区(byte[]),手动减少 read write 次数。
2.使用标准库提供的“缓冲区流” BufferStream ,就是把 InputStream 之类的对象套上一层。(就是用起来比较麻烦)

相关文章:

文件操作和IO ——Java

初识文件 首先文件分为: 1.狭义的文件 – 保存在硬盘上的文件。 2.广义的文件 – 操作系统进行资源管理的一种机制。很多的软件/硬件资源,抽象成“文件”来进行表示。 (println > 控制台,scanner > 控制台的标准输入&#…...

dmsetup 清理ceph osd残留磁盘分区

在物理机上接入磁盘并准备格式化时,发现磁盘中存在之前残留的 Ceph OSD 分区。尝试运用 fdisk 重新分区、重新格式化,以及使用 sgdisk 格式化,甚至重写磁盘头,都未能成功清理掉这些 OSD 残留分区。最终,借助 dmsetup 直…...

每日一题(小白)字符串娱乐篇16

分析题意可以了解到本题要求在一串字符串中找到所有组合起来排序递增的字符串。我们可以默认所有字符在字符串中的上升序列是1,从第一个字符开始找,如果后面的字符大于前面的字符就说明这是一个上序列那么后面字符所在的数组加一,如果连接不上…...

【Mac 从 0 到 1 保姆级配置教程 11】- Mac 基础配置 Finder、触控板、常用快捷键等

文章目录 前言配置 Finder1. 把我们的家目录请出来2. 显示文件扩展名3. 展示隐藏文件4. 显示路径栏和状态栏5. 固定文件夹到工具栏 基础快捷键1. Finder 导航快捷键2. 文件操作快捷键3. 视图和显示快捷键4. 搜索和选择快捷键5. 实用技巧6. 关于文件创建 配置触控板1. 右键设置2…...

Redis 渐进式rehash怎么判定rehash完成了?

Redis 渐进式 Rehash 的完成判断机制 在 Redis 的字典(dict)结构扩容或缩容时,会使用 渐进式 Rehash 来避免一次性迁移所有键值对导致的阻塞。以下是判断旧哈希表(ht[0])是否全部迁移完毕的核心逻辑: 1. 渐进式 Rehash 的核心流程 Redis 的字典结构包含两个哈希表: t…...

Redis的常用数据结构

三. Redis 的常用数据结构 (redis提供的查询功能, 不像mysql这么强大) 1. 认识数据类型和编码方式 常见数据结构 (数据类型) : string (字符串), list (列表), hash (哈希), set (集合), zset (有序集合). Redis 底层在实现上述数据结构的时候, 会在源码层面进行优化, 来达到…...

c++中的虚函数

在C中,虚函数(Virtual Function)是一种实现多态的重要机制,它允许在派生类中重写基类的函数,从而在运行时根据对象的实际类型调用相应的函数版本。 1. 虚函数的定义 虚函数是在基类中使用关键字virtual声明的函数。例…...

unreal engine5开发仿鬼泣5的游戏,把敌人击飞到空中4连击

UE5系列文章目录 文章目录 UE5系列文章目录前言一、实现思路二、具体蓝图 前言 unreal engine5开发仿鬼泣5的游戏,把敌人击飞到空中4连击,先看下效果 一、实现思路 unreal engine5开发仿鬼泣5的游戏,把敌人击飞到空中4连击 在Unreal Engi…...

蓝桥杯嵌入式第十四届模拟二(PWM、USART)

一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.c、fun.h、headfile.h文件,去资源包中把lc…...

深挖 TypeScript 基础数据类型:应用与陷阱

在 TypeScript 的学习与实践过程中,对基础数据类型的深入理解和正确运用,是写出高质量代码的关键。本篇文章会通过探讨数据类型在实际场景中的应用,分析常见错误,帮助大家提升运用 TypeScript 基础数据类型的能力。​ 一、函数参…...

B站视频教材: Yocto项目实战教程 第一章 PPT讲解

B站视频链接,请多多关注本人B站: 📌 Yocto项目实战教程:第一章 视频讲解 在当今嵌入式系统快速发展的背景下,越来越多的设备和行业依赖于高效、可定制、可维护的操作系统解决方案。嵌入式Linux系统,凭借其开源灵活性和…...

嵌入式软件开发调试方法

文章目录 1. 利于函数返回值,retrurn 定位错误位置2. 合理使用逻辑分析仪(正点原子 厉害!!) 1. 利于函数返回值,retrurn 定位错误位置 如下图所示,设置不同的返回值,0是ok的,其他值均为失败&…...

Sentinel核心源码分析(上)

文章目录 前言一、客户端与Spring Boot整合二、SphU.entry2.1、构建责任链2.2、调用责任链2.2.1、NodeSelectorSlot2.2.2、ClusterBuilderSlot2.2.3、LogSlot2.2.4、StatisticSlot2.2.5、AuthoritySlot2.2.6、SystemSlot2.2.7、FlowSlot2.2.7.1、selectNodeByRequesterAndStrat…...

TCPIP详解 卷1协议 一 概述

相关概念 协议族:一系列相关协议的集合称为一个协议族体系结构:指定一个协议族中的各种协议之间的相互关系并划分需要完成的任务的设计,称为协议族的体系结构。分组交换:数据被分割为固定或可变长度的分组 ,每个分组包…...

条件生成对抗网络(Conditional GAN, CGAN)原理及实现(pytorch版)

CGAN 原理及实现 一、CGAN 原理1.1 基本概念1.2 与传统GAN的区别1.3 目标函数1.4 损失函数1.5 条件信息的融合方式1.6 与其他GAN变体的对比1.7 CGAN的应用1.8 改进与变体二、CGAN 实现2.1 导包2.2 数据加载和处理2.3 构建生成器2.4 构建判别器2.5 训练和保存模型2.6 绘制训练损…...

类与对象(上)

【本节目标】 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 1.面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,…...

MySQL基础 [三] - 数据类型

目录 数据类型分类 ​编辑 数值类型 tinyint bit 浮点类型 float decimal 字符串类型 char varchar varchar和char的比较和选择 日期和时间类型 enum和set enum类型 set类型 enum和set的类型查找 数据类型分类 数值类型 tinyint TINYINT[(M)] [UNSIGNED]是 …...

1.1 测试计划阶段:如何制定高效的测试策略

测试计划阶段:如何制定高效的测试策略 摘要 本文详细介绍了软件测试流程中的测试计划阶段,包括测试策略制定、资源规划、进度安排和风险管理等内容。通过本文,读者可以系统性地了解如何制定有效的测试计划,确保测试工作有序进行…...

Spring 概念

Spring 是一个功能强大、灵活且广泛使用的 Java 企业级开发框架,它诞生于 2003 年,由 Rod Johnson 创建,初衷是简化 Java EE 的开发过程。 一、Spring 是什么? 简单来说: Spring 是一个轻量级的 Java 开发框架&#…...

animals_classification动物分类

数据获取 深度学习训练中第一个是获取数据集,数据集的质量很重要,我们这里做的是动物分类,大致会选择几个动物,来做一个简单的多分类问题,数据获取的方法,鼠鼠我这里选择使用爬虫的方式来对数据进行爬取&a…...

15.QT窗口:主窗口、浮动窗口、对话框

0. 概述 Qt窗口是通过 QMainWindow类 来实现的。 QMainWindow 是一个为用户提供主窗口程序的类,继承自QWidget类,并且提供了一个预定义的布局。QMainWindow包含一个菜单栏(menu bar)、多个工具栏(tool bars&#xff…...

nginx中地理位置访问控制模块geo

1.安装 GeoIP2 模块 Ubuntu/Debian 系统: sudo apt-get update sudo apt-get install nginx-module-geoip2 sudo apt-get install libnginx-mod-http-geoip2CentOS/RHEL 系统: sudo yum install nginx-module-geoip22.下载 GeoIP2 数据库 下载 GeoIP2 …...

基于SpringBoot酒店管理系统设计和实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

蓝桥杯嵌入式第十四届模拟二

一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.c、fun.h、headfile.h文件,去资源包中把lc…...

【前端】Node.js一本通

近两天更新完毕,建议关注收藏点赞。 目录 复习Node.js概述使用fs文件系统模块path路径模块http模块模块化 复习 为什么JS可以在浏览器中执行 原理:待执行的JS代码->JS解析引擎 不同的浏览器使用不同的 JavaScript 解析引擎:其中&#xf…...

Groovy

一:了解 1:groovy保留字 2: 标识符 二:数据类型 1:字符串(1) 1: java.lang.string 定义的字符串是不能改变的 2: groovy.lang.GString 定义的字符串的值是不能改变的 2: 总结 三:数值类型 1: Groovy的数值型包括整数型(integer)…...

【并发编程 | 第七篇】深入学习线程池(一)

什么是线程池? 线程池是用来管理和复用线程的⼯具,它可以减少线程的创建和销毁开销。 在 Java 中,ThreadPoolExecutor 是线程池的核⼼实现,它通过核⼼线程数、最⼤线程数、任务队列和拒绝策略来 控制线程的创建和执⾏。 举个栗…...

C++ 获取一整行(一行)字符串并转换为数字

代码很简单&#xff0c;主要是自己总是忘记&#xff0c;记录一下&#xff1a; #include <iostream> #include <cstdlib> #include <cstring>#include <string> #include <vector> #include <sstream>using namespace std;void print_int_…...

初探:简道云平台架构及原理

一、系统架构概述 简道云作为一款低代码开发平台&#xff0c;其架构设计以模块化和云端协同为核心&#xff0c;主要分为以下层次&#xff1a; 1. 前端层 可视化界面&#xff1a;基于Web的拖拽式表单设计器&#xff0c;支持动态渲染&#xff08;React/Vue框架&#xff09;。多…...

鸿蒙Arkts开发飞机大战小游戏,包含无敌模式,自动射弹,暂停和继续

飞机大战可以把飞机改成图片&#xff0c;目前包含无敌模式&#xff0c;自动射弹&#xff0c;暂停和继续的功能 代码如下&#xff1a; // 定义位置类 class GamePosition {x: numbery: numberconstructor(x: number, y: number) {this.x xthis.y y} }Entry Component struct…...

使用`sklearn`中的逻辑回归模型进行股票的情感分析,以及按日期统计积极和消极评论数量的功能

以下是完成上述任务的Python代码&#xff0c;可在Jupyter Notebook中运行。此代码包含了使用sklearn中的逻辑回归模型进行情感分析&#xff0c;以及按日期统计积极和消极评论数量的功能。 import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer f…...

简洁的 PlantUML 入门教程

评论中太多朋友在问&#xff0c;我的文章中图例如何完成的。 我一直用plantUML,也推荐大家用&#xff0c;下面给出一个简洁的PlantUML教程。 &#x1f331; 什么是 PlantUML&#xff1f; PlantUML 是一个用纯文本语言画图的工具&#xff0c;支持流程图、时序图、用例图、类图、…...

Python 面向对象 - 依赖倒置原则 (DIP)

1. 核心概念 依赖倒置原则(Dependency Inversion Principle, DIP) 是SOLID原则中的"D"&#xff0c;包含两个关键点&#xff1a; 高层模块不应依赖低层模块&#xff0c;二者都应依赖抽象抽象不应依赖细节&#xff0c;细节应依赖抽象 2. 使用场景 典型应用场景 系…...

自动化框架及其设计搭建浅谈(二)--分层自动化测试

目录 测试金字塔模型 分层自动化测试的模型 分层自动化测试的最佳实践 自动化分层测试的误区 自动化框架的设计与自动化分层 自动化测试的设计建议 分层自动化测试&#xff0c;顾名思义&#xff0c;就是分层的自动化测试&#xff0c;那么自动化测试为什么要分层呢&#x…...

ResNet改进(19):基于PyTorch的ResNet改进方案详解:Mish激活+SPP模块+MixUp数据增强

1. 前言 ResNet作为深度学习领域里程碑式的网络架构,在图像分类等计算机视觉任务中表现出色。然而,随着研究的深入和技术的发展,原始的ResNet架构仍有改进空间。本文将详细介绍一种基于PyTorch的ResNet改进方案,该方案融合了Mish激活函数、SPP模块和MixUp数据增强等先进技…...

设计模式简述(九)命令模式

命令模式 描述基本使用使用 描述 命令模式是一种体现高内聚的行为模式。 将整个请求封装成一个命令对象&#xff0c;由这个命令对象完成所需业务调用。 命令对象封装了该命令需要的所有逻辑&#xff0c;不需要调用方关注内部细节。 基本使用 定义抽象命令&#xff08;所有命…...

Codecademy—— 交互式编程学习的乐园

一、网站概述 Codecademy 是一家美国在线学习编程知识的网站&#xff0c;它为编程学习者提供了一种全新的学习方式。在如今众多的编程学习平台中&#xff0c;Codecademy 凭借其独特的优势脱颖而出&#xff0c;吸引了全球数百万用户。其目标是帮助更多人轻松学习编程&#xff0…...

分布式数据库HBase

1.概述 1.1从BigTable 说起 BigTable是一个分布式存储系统&#xff0c;BigTable起初用于解决典型的互联网搜索问题。 BigTable是一个分布式存储系统利用谷歌提出的MapReduce分布式并行计算模型来处理海量数据使用谷歌分布式文件系统GFS作为底层数据存储采用Chubby提供协同服…...

Linux进程地址空间(12)

文章目录 前言一、进程空间地址基本概念代码分析 二、如何理解地址空间三、进一步理解页表和写实拷贝对虚拟地址的进一步深入fork() 的两个返回值&#xff1f; 总结 前言 融会贯通&#xff01;   本篇会让你再次对计算机世界里面的大智慧感到汗颜&#xff01; 本篇研究环境基…...

鸿蒙开发04界面渲染

文章目录 前言一、条件渲染1.1 if/else1.2 属性控制1.3 可见性 二、循环渲染三、滚动渲染3.1 下拉刷新3.2 上拉加载 前言 在声明式描述语句中开发者除了使用系统组件外&#xff0c;还可以使用渲染控制语句来辅助UI的构建&#xff0c;这些渲染控制语句包括控制组件是否显示的条…...

CANoe CAPL——Ethernet CAPL函数

CANoe CAPL——CAN CAPL函数 事件过程&#xff08;Event Procedures&#xff09; 函数名简要描述on ethernetErrorPacket收到错误的以太网数据包时调用。on ethernetMacsecStatus当物理端口的以太网 MACsec 连接状态变化时调用。on ethernetPacket接收到以太网数据包后调用。…...

语法: setup_lcd (mode, prescale, [segments]);

SETUP_LCD( ) 语法: setup_lcd (mode, prescale, [segments]); 参数: mode可能是来自devices.h头文件如下常数: LCD_DISABLED, LCD_STATIC, LCD_MUX12, LCD_MUX13, LCD_MUX14 下面的参数:STOP_ON_SLEEP, USE_TIMER_1可同上面的LCD_DISABLED, LCD_STATIC, LCD_MUX12, LCD…...

微前端随笔

✨ single-spa&#xff1a; js-entry 通过es-module 或 umd 动态插入 js 脚本 &#xff0c;在主应用中发送请求&#xff0c;来获取子应用的包&#xff0c; 该子应用的包 singleSpa.registerApplication({name: app1,app: () > import(http://localhost:8080/app1.js),active…...

实操(不可重入函数、volatile、SIGCHLD、线程)Linux

1 不可重入函数 为什么会导致节点丢失内存泄露&#xff1f;main函数在执行insert&#xff0c;但是没执行完就被信号中断了&#xff0c;又进了这个函数里&#xff0c;所以这个insert函数在不同的执行流中&#xff0c;同一个函数被重复进入&#xff0c;如果没有问题&#xff0c;…...

如何在Linux系统上通过命令调用AI大模型?

如何在Linux系统上通过命令调用AI大模型&#xff1f; 文章目录 如何在Linux系统上通过命令调用AI大模型&#xff1f;一、准备工作二、编写API调用脚本三、配置命令行工具 使用AI命令帮我做一个文档总结提问技术问题编写简单的shell脚本帮我写一个docker-compose 在这个AI技术飞…...

数据分析-Excel-学习笔记Day1

Day1 复现报表聚合函数&#xff1a;日期联动快速定位区域SUMIF函数SUMIFS函数环比、同比计算IFERROR函数混合引用单元格格式总结汇报 拿到一个Excel表格&#xff0c;首先要看这个表格的构成&#xff08;包含了哪些数据&#xff09;&#xff0c;几行几列&#xff0c;每一列的名称…...

负载均衡是什么,Kubernetes如何自动实现负载均衡

负载均衡是什么&#xff1f; 负载均衡&#xff08;Load Balancing&#xff09; 是一种网络技术&#xff0c;用于将网络流量&#xff08;如 HTTP 请求、TCP 连接等&#xff09;分发到多个服务器或服务实例上&#xff0c;以避免单个服务器过载&#xff0c;提高系统的可用性、可扩…...

洞察 Linux 进程管理

一、进程和线程的概念 1.进程 &#xff08;1&#xff09;概念 进程是程序在操作系统中的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位。进程是程序的执行实例&#xff0c;拥有独立的资源&#xff08;如内存、文件描述符等&#xff09;。每个进程在创建时会被…...

http协议版本的区别 -- 2和3

目录 http2和http3的区别 传输层协议 QUIC协议 介绍 连接建立与握手 建立安全连接的过程 RTT 建连为什么需要两个过程 原因 解决 QUIC协议的1-RTT 建连 必要性 连接过程 第一次握手(Client Hello) 版本号 key_share 其他 第二次握手 介绍 Server Hello 身…...

Vue2-实现elementUI的select全选功能

文章目录 使用 Element UI 的全选功能自定义选项来模拟全选 在使用 Element UI 的 el-select组件时&#xff0c;实现“全选”功能&#xff0c;通常有两种方式&#xff1a;一种是使用内置的全选功能&#xff0c;另一种是通过自定义选项来模拟全选。 使用 Element UI 的全选功能…...