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

文件操作和IO-3 文件内容的读写

文件内容的读写——数据流

流是操作系统提供的概念,Java对操作系统的流进行了封装。

数据流就像水流,生生不息,绵延不断。

水流的特点:比如要100mL的水,可以一次接10mL,分10次接完,也可以一次接5mL,分20次接完,也可以一次接100mL水一次接完……(此处我们接的方法有无数多种,但最终得到的效果是一样的)

文件中的数据流也是类似的情况:比如要读写100字节的数据,可以一次读写10字节,分10次完成。也可以一次读写5字节,分20次完成。也可以一次读写1字节,分100次读写完。也可以一次读写100字节,1次读完……(此处对小儿的方式也是任意多的情况,最终得到的效果也是一样的)

Java标准库种对于流进行了一系列的封装,提供了一组类来负责进行这些工作。针对这些类,大概可以两个类别:

1、字节类:以字节为单位进行读写,一次最少读写一个字节。

代表类:InputStream(针对文件进行读操作)           OutputStream(针对文件进行写操作)

2、字符流:以字符为单位进行读写,一次最少读取一个字符。比如:如果是utf8编码表示汉字,3个字节表示一个汉字,每次读写都得以3个字节为单位(即以一个汉字为单位)来进行读写

代表类:Reader(针对文件进行读操作)                    Writer(针对文件进行写操作)

读写文件在编程语言中的固定套路:1、打开文件   2、关闭文件   3、读文件    4、写文件

字节流

InputStream

方法

注意:inputStream是一个抽象类,要是有还需要具体的实现类。关于InputStream的实现类有很多,基本可以认为不同的输入类型都可以对应一个InputStream类,我们此处是从文件中读取,使用FileInputStream

这是InputStream类的源码,被abstract修饰表示这是一个抽象类。

有些类,我们不希望它能够创建出实例来。就使用abstract来修饰它,编译器就可以进行检查,如果想要创建实例就会编译报错。所谓面向对象,就是通过代码抽象来表示实际事物的一种方式。

抽象这个词语本身很难理解,但是这个词语又是计算机比较常见的词语。那么,我们作为程序员又应该如何理解抽象呢?可以尝试理解抽象的反义词——形象/具体。

如图,这是一只具体的小猫

具体的猫,我们就能看到更多的信息,比如:这只猫是中华田园猫,毛色是黑白相间的,眼睛是棕色的,胡须是白色的……

抽象的小猫:

只具备猫的最基本特征,但无法获得更多的信息。

信息越多,就越具体。信息越少,就越抽象。

我们程序员写代码,很多时候,就是要用抽象的方式来比较表示具体的事物。

 古老的面试题:interface和abstract之间的区别

FileInputStream

构造方法

实例化FileInputStream对象的过程,也就是打开文件的过程。

代码如下:

 public static void main(String[] args) throws FileNotFoundException {InputStream inputStream = new FileInputStream("./test.txt");}

注意:在创建FileInputStream对象时需要抛出一个FileNotFoundException(文件未被找到)异常!!!

我们刚才讲过,在各种编程语言中,读写文件需要打开文件、关闭文件、读文件、写文件。我们现在既然打开了文件,就要考虑关闭文件。

close方法

关闭文件需要使用close方法,这个方法同样也需要抛出一个IOException,它是上面的FileNotFoundException的父类,所以我们总的只需要抛出一个IOException。

 public static void main(String[] args) throws IOException {InputStream inputStream = new FileInputStream("./test.txt");inputStream.close();}

关闭文件的操作,也可以理解是释放了文件的相关资源。 

我们在计算机是如何工作那篇博客中讲过,进程是由一个PCB(进程控制块)组成的,PCB中有一个属性是文件描述符表,记录了当前进程都打开了那些文件。用顺序表/数组存储,数组中的每个元素都是一个结构体,这个结构体就具体地描述了打开的文件在文件系统上的一些属性。每次打开一个文件,都是需要在文件描述符表中占据一个位置的,如果不关闭一直打开的话,就会导致文件描述符表被耗尽(文件描述符表的长度是有上限的)。当文件描述符表被耗尽了以后,后续打开文件就会打开失败,从而导致文件资源泄露,内存泄漏。

那为什么文件描述符表不能整个像ArrayList一样的自动扩容机制呢???

这会付出很大的代价,对于操作系统内核来说对于性能的要求是很高的,内核的任务很重,所以对性能的要求会很高,如果要进行上述自动扩容操作,要十分慎重。有可能因为扩容引起了系统卡顿,就得不偿失了

内存泄漏问题,由于Java提供了GC(垃圾回收机制),我们不太需要担心内存泄漏问题,相当于是给我们的家里请了一位保洁阿姨,每隔一段时间就会帮我们收拾屋子,丢丢垃圾啥的。

如果我们的代码像上面那么写,那么是有可能执行不到关闭文件这里的(中间执行其他逻辑时可能会有return或者抛出异常):

 public static void main(String[] args) throws IOException {//打开文件InputStream inputStream = new FileInputStream("./test.txt");//其他逻辑//关闭文件inputStream.close();}

所以我们可以使用finally来确保这一步close方法一定能执行到。但又出现问题了:inputStream是在try代码块中被实例化的,是一个局部变量,在finally里面根本不认识inputStream这个变量。所以我们需要将inputStream定义在try的外面。 

代码如下:

public static void main(String[] args) throws IOException {InputStream inputStream = null;//打开文件try {inputStream = new FileInputStream("./test.txt");//其他逻辑}finally {//关闭文件inputStream.close();}}

Java中还提供了另一个版本:try-with-resources。注意:只有实现了Closeable接口的类,才能使用该方法,此时try方法就会自动帮我们调用close方法释放资源了。 

代码如下:

    public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")) {}}
read方法

第一个:无参数版本,每次调用读取一个字节,返回值是读取到的这个字节的值,看起来返回值是int,实际上是byte,因为这个方法读到文件的末尾继续读会返回-1(byte的取值范围是0~255),所以看起来返回值是int。 

第二个:一个参数,传入的参数是字节数组,是一个“输出型参数”。从输入流中读取一定字节并将其存储到缓冲区数组b中。(此处的byte[  ]是引用类型,方法内部针对数组内容进行修改,方法执行结束之后,方法外部也仍然生效)。

上面两组代码的打印分别是多少呢?

第一组的打印结果是0。原因:func方法外的a是实参,而在func方法中传入的a是形参,函数对形参的修改,并不会改变函数实参的值,所以打印的结果仍然为0。

第二组的结果是100。原因:方法内部是针对数组内容进行修改的,数组是引用类型,a[0] = 100是解引用操作,方法执行结束之后,方法外部也能生效。

那这个代码的结果是啥呢?

结果是“”。原因:上面代码执行的操作实际上是对引用赋值(并非是解引用操作),也就相当于方法内的形参引用s指向了一个新的对象(字符串),而方法外实参所指向的对象并没有改变。

第三个:第三个参数版本,大体和第二个版本一样,只是增添了开始和结束的位置。off-->offset

注意:read的第二个和第三个版本,返回的int就不是读取到的值了,而是实际读取到的字节的个数。默认情况下,read会尝试把数组填满,但是文件的实际剩余的长度可能并不足以被填满,所以返回值会告诉我们实际填了多少个字节。

代码示例: 

首先,先准备好我们要读的文件

下面,我们将编写代码以16进制的形式打印上面的文件: 

  public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")) {while(true) {int x = inputStream.read();if(x == -1){break;}System.out.printf("%x ",x);}}}

因为是以16进制的形式打印,所以输出结果是61 62 63 64 65 66 67:

一个参数的版本: 

 public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")) {while(true) {byte[] buffer = new byte[1024];int x = inputStream.read(buffer);if(x == -1){break;}for (int i = 0; i < x; i++) {System.out.printf("%x ",buffer[i]);}}}}

打印结果:

buffer也是计算机中的常用术语,表示“缓冲器”,往往是一个内存空间。读文件是把硬盘中的数据读到内存中,上面的写法,一次能够读若干个字节,要比一次读一个字节更加高效。

操作硬盘,本身就是一个比较低效的操作,我们程序员期望的是,低效的操作,出现的次数越少越好,效率就会更高!!!   

如果此时test.txt文件中的是汉字的话,我们也可以基于字节数组构成String进行打印。 

先把刚才的文件内容改成汉字:

代码如下:

public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")) {while(true) {byte[] buffer = new byte[1024];int x = inputStream.read(buffer);if(x == -1){break;}String s = new String(buffer,0,x);System.out.println(s);}}}

注意:在 String s = new String(buffer, 0, n); 此处构造 String 是通过前 n 个字节构造,而不是整个数组,实际读取文件的内容可能不足 1024个字节。

OutputStream

方法:

OutputStream同样是一个抽象类,使用时也是需要具体实现类。

FileOutputStream
write方法:

第一个版本:一次写一个字节。

第二个版本:一次写若干个字节。

第三个版本:将若干个字节写在数组的指定部分。

代码示例:

 public static void main(String[] args) throws IOException {try(OutputStream outputStream = new FileOutputStream("./test.txt")){byte[] buffer = new byte[]{97,98,99,100,101,102,103};outputStream.write(buffer);}}

 运行结果:

可以看到我们刚才的“你好”被消除了,然后重新写上了abcdefg(97~103对应得ASCLL码值)。

注意:此处的OutputStream操作默认会把文件之前的内容清空掉,然后从头重新写!!!(并不是write方法引起的,而是在打开文件时就已经清除了)

如果我们想在原来写的基础上添加内容,也可以使用追加写的方式,不清空文件内容,把新的内容写到文件末尾。

只需要在创建OutptStream对象时,在后面追加一个append参数即可:

执行结果:

 

字符流

Reader

Reader的使用方法和InputStream差不多 ,但是此处读就是以1个字符为最小单位了。

代码如下:

public static void main(String[] args) throws IOException {try(Reader reader = new FileReader("./test.txt")){while(true) {char[] butter = new char[1024];int n = reader.read(butter);if (n == -1){break;}for (int i = 0; i < n; i++) {System.out.print(butter[i] + " ");}}}}

文件内容: 

 运行结果:

那此时大家可能就会有疑问,一个字符不是占2个字节吗?那如果文件里的是中文,中文按照utf8编码,每个字符是3个字节,但是此处读取来的字符这么就成2个字节了呢 ?

代码如下:

public static void main(String[] args) throws IOException {try(Reader reader = new FileReader("./test.txt")){while(true) {char[] butter = new char[1024];int n = reader.read(butter);//read时会把utf8转为unicodeif (n == -1){break;}String s = new String(butter,0,n);//基于unicode构造成StringSystem.out.println(s);}}}

上面的代码,相当于把文件中的utf8编码在按照字符读取的时候,先转成unicode,每个char里面存储的是对应的unicode的值。然后基于unicode最终再构造成utf8的String(这个过程已经被Java内部封装过了,没办法直接感受到~~)。

先把文件改成中文字符:

运行结果如下:

Writer

Writer字符流和OutputStream的使用方法差不多,只是和Reader一样以1字符为最小单位进行写操作。

代码示例:

public static void main(String[] args) throws IOException {try (Writer writer = new FileWriter("./test.txt",true)){char[] buffer = new char[]{97,98,99,100};writer.write(buffer);}}

 运行结果:

总结:

补充:也可以使用Scammer来辅助我们进行读取文件,Scanner里面的System.in本质上就是一个InputStream。

代码示例: 

 public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")){Scanner scanner = new Scanner(inputStream);while(scanner.hasNext()){String s = scanner.next();System.out.println(s);}}}

 运行结果:

相关文章:

文件操作和IO-3 文件内容的读写

文件内容的读写——数据流 流是操作系统提供的概念&#xff0c;Java对操作系统的流进行了封装。 数据流就像水流&#xff0c;生生不息&#xff0c;绵延不断。 水流的特点&#xff1a;比如要100mL的水&#xff0c;可以一次接10mL&#xff0c;分10次接完&#xff0c;也可以一次接…...

Day 0015:Metasploit 基础解析

目录 一、理论学习&#xff08;Metasploit 架构与核心组件&#xff09; 一、架构设计&#xff1a;分层与模块化 基础层&#xff08;Ruby 框架&#xff09;&#xff1a; 核心层&#xff08;模块引擎&#xff09;&#xff1a; 接口层&#xff08;交互界面&#xff09;&#…...

相机标定与图像处理涉及的核心坐标系

坐标系相互关系 #mermaid-svg-QxaMjIcgWVap0awV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QxaMjIcgWVap0awV .error-icon{fill:#552222;}#mermaid-svg-QxaMjIcgWVap0awV .error-text{fill:#552222;stroke:#552…...

单例模式的运用

单例模式实现分析 在我们的向量数据库配置类 MilvusVectorDatabaseConfig 中&#xff0c;采用了单例模式的实现方式&#xff0c;这是一种非常经典且实用的设计模式。 饿汉式单例实现 这种实现方式属于饿汉式单例模式&#xff0c;它的优点在于&#xff1a; // 在类加载时就创…...

PageHelper分页原理解析:从源码到MySQL方言实现

一、引言 分页查询是Web开发的必备功能&#xff0c;MyBatis生态中的PageHelper以其简单易用的特性广受欢迎。本文将从源码层面&#xff08;v5.3.2&#xff09;解析PageHelper的分页实现机制&#xff0c;结合MySQL方言展示完整的执行链路。 二、核心实现原理 1. 插件初始化 …...

MySQL中索引最左前缀法则、索引失效情况、前缀索引、索引设计原则

最左前缀法则 联合索引中&#xff0c;最左前缀法则指的是查询从索引的最左列开始&#xff0c;并且不跳过索引中的列&#xff0c;如果跳跃某一列&#xff0c;索引将会部分失效&#xff08;后面的字段索引失效&#xff09;举例假设有一个联合索引包含三个字段按顺序&#xff1a;…...

pdf图片导出(Visio和Origin)

一、Visio 导入pdf格式图片 1. 设计->大小&#xff0c;适应绘图。 2. 文件->导出&#xff0c;导出为pdf格式。 上面两部即可得到只包含图的部分的pdf格式。 如果出现的有默认白边&#xff0c;可以通过以下方式设置&#xff1a; 1. 文件->选项->自定义功能区->…...

NR 通讯的整体架构

前言&#xff1a; 并假设发射器发送了一个信号&#xff0c;如左下角所示&#xff08;蓝色&#xff09;&#xff0c;接收器检测到的信号显示在右侧&#xff08;红色&#xff09;。您在图中注意到的第一件事是什么&#xff1f;那就是发送的信号和接收的信号并不完全相同。 有什么…...

【大模型面试每日一题】Day 26:从伦理角度,大模型可能存在哪些潜在风险?技术上如何实现内容安全控制(如RLHF、红队测试)?

【大模型面试每日一题】Day 26&#xff1a;从伦理角度&#xff0c;大模型可能存在哪些潜在风险&#xff1f;技术上如何实现内容安全控制&#xff08;如RLHF、红队测试&#xff09;&#xff1f; &#x1f4cc; 题目重现 &#x1f31f;&#x1f31f; 面试官:从伦理角度&#xf…...

第六届电子通讯与人工智能国际学术会议(ICECAI 2025)

在数字化浪潮中&#xff0c;电子通讯与人工智能的融合正悄然重塑世界的运行逻辑。技术基础的共生关系是这场变革的核心——电子通讯如同“信息高速公路”&#xff0c;通过5G等高速传输技术&#xff0c;将海量数据实时输送至AI系统&#xff0c;使其能够像人类神经系统般快速响应…...

深入剖析 5G 核心网中的 PLMN

一、引言 在 5G 技术迅猛发展的当下,5G 核心网作为整个通信系统的关键枢纽,支撑着海量数据传输、低延迟通信以及多样化业务应用。其中,公共陆地移动网络(Public Land Mobile Network,PLMN)扮演着极为重要的角色,它是 5G 核心网实现用户接入、网络管理以及业务提供的基础…...

佰力博科技与您探讨半导体电阻测试常用的一些方法

一、两探针法​ 两探针法是一种较为基础的测试方法。该方法将两根探针与半导体样品表面紧密接触&#xff0c;通过电源在两根探针之间施加电压&#xff0c;同时使用电流表测量通过样品的电流&#xff0c;再根据欧姆定律计算电阻。​这种方法的优点在于操作简单、设备要求较低&a…...

5G 核心网中的 NPN 功能详解

引言 在 5G 技术飞速发展的今天,5G 核心网不断演进,为各类应用场景提供强大支撑。其中,NPN(Non-Public Network,非公共网络)功能作为 5G 核心网的重要特性,正逐渐崭露头角,在众多行业中发挥着关键作用。它为特定用户或组织打造专属网络环境,满足其对网络性能、安全性…...

谷歌medgemma-27b-text-it医疗大模型论文速读:多语言大型语言模型医学问答基准测试MedExpQA

《MedExpQA: 多语言大型语言模型医学问答基准测试》论文解析 一、引言 论文开篇指出大型语言模型&#xff08;LLMs&#xff09;在医学领域的巨大潜力&#xff0c;尤其是在医学问答&#xff08;QA&#xff09;方面。尽管LLMs在医学执照考试等场景中取得了令人瞩目的成绩&#…...

# 深入解析BERT自然语言处理框架:原理、结构与应用

深入解析BERT自然语言处理框架&#xff1a;原理、结构与应用 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;框架的出现无疑是一个重要的里程碑。它凭借其强大的语言表示能…...

js中encodeURIComponent函数使用场景

encodeURIComponent 是 JavaScript 中的一个内置函数&#xff0c;它的作用是&#xff1a; 将字符串编码为可以安全放入 URL 的形式。 ✅ 为什么需要它&#xff1f; URL 中有一些字符是有特殊意义的&#xff0c;比如&#xff1a; ? 用来开始查询参数 & 分隔多个参数 连接…...

【NLP 77、Python环境管理工具之conda】

如果你第一万次否定自己&#xff0c;那我希望我可以一万零一次大声称赞你 —— 25.5.22 一、什么是conda conda是一个开源的包管理系统和环境管理系统&#xff0c;主要用于Python语言&#xff0c;但也可以用于其它语言的项目 二、为什么要使用conda ① 多环境共存&#xff0c;多…...

替代云数据库的本地方案:MySQL+phpMyAdmin的远程管理与跨网络访问技术

文章目录 前言1. 安装MySQL2. 安装phpMyAdmin3. 修改User表4. 本地测试连接MySQL5. 安装cpolar内网穿透6. 配置MySQL公网访问地址7. 配置MySQL固定公网地址8. 配置phpMyAdmin公网地址9. 配置phpmyadmin固定公网地址 前言 对于运维来说&#xff0c;平时还好&#xff0c;一旦出门…...

Dify大语言模型应用开发环境搭建:打造个性化本地LLM应用开发工作台

文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 各位小伙伴们&#xff0c;大家好&#xff01;今天我们要来一场技术大冒险&#xff0c;手把手教你如何在Linux Ubuntu系统上使用Docke…...

MySQL索引事务

索引 通过索引可以对查询操作进行优化&#xff0c;通过减少全表扫描&#xff0c;快速定位数据&#xff0c;原本的查询操作是对表进行遍历&#xff0c;如果是大表效率较低 1&#xff09;注意事项 占用了更多的空间&#xff0c;由于生成索引需要依赖于数据结构和额外数据&…...

Seay代码审计工具

Seay代码审计工具 介绍 Seay代码审计工具是一款由国内安全研究人员"Seay"开发的源代码安全审计工具&#xff0c;主要用于帮助安全人员快速发现PHP代码中的安全漏洞&#xff0c;快速定位代码中的安全风险点。 主要功能特点 自动化审计功能 支持自动扫描PHP代码中的…...

【人工智障生成日记1】从零开始训练本地小语言模型

&#x1f3af; 从零开始训练本地小语言模型&#xff1a;MiniGPT TinyStories&#xff08;4090Ti&#xff09; &#x1f9ed; 项目背景 本项目旨在以学习为目的&#xff0c;从头构建一个完整的本地语言模型训练管线。目标是&#xff1a; ✅ 不依赖外部云计算✅ 完全本地运行…...

技术分享:大数据挖掘平台架构设计与行业应用实践

在数字化转型浪潮下&#xff0c;企业数据规模呈指数级增长。如何构建高效的数据挖掘体系&#xff0c;实现数据价值变现&#xff0c;成为技术团队面临的重要课题。本文将深入探讨大数据挖掘平台的核心架构、关键技术及行业应用实践。 一、平台架构设计 1. 数据采集层 支持多源异…...

线性Wi-Fi FEM被卷死,非线性FEM是未来?

在跑了一圈路由器客户之后&#xff0c;我的内心反而平静下来&#xff0c;被卷死的不只是Wi-Fi FEM赛道&#xff0c;还有家用路由器市场。 尽管路由器市场比较惨淡&#xff0c;不过客户还是很愿意接见我&#xff0c;并做更广泛的交流和探讨。一方面之前推Wi-Fi FEM的众多厂商在渐…...

OpenCV CUDA模块图像过滤------用于创建一个最小值盒式滤波器(Minimum Box Filter)函数createBoxMinFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数创建的是一个 最小值滤波器&#xff08;Minimum Filter&#xff09;&#xff0c;它对图像中每个像素邻域内的像素值取最小值。常用于&…...

【MySQL】06.MySQL表的增删查改

1. insert 我们先创建一个表结构&#xff0c;这部分操作我们使用这张表完成我们的操作&#xff1a; mysql> create table student(-> id int primary key auto_increment,-> name varchar(20) not null,-> qq varchar(20) unique-> ); Query OK, 0 rows affec…...

MySQL 索引失效及其解决办法

一、前言 在数据库优化中,索引(Index)是一项至关重要的技术手段,可以显著提升查询性能。然而,在实际开发过程中,MySQL 索引并不总是如预期生效。本文将从原理出发,系统地介绍索引失效的常见场景及其解决方案,帮助开发者有效规避性能陷阱。 二、索引基础回顾 MySQL 支…...

在线时间戳(Unix TimeStamp)转换器

做了一个在线时间戳转换器&#xff0c;简单、好用&#xff0c;提供多种日期格式。 移动端友好。 目标是做一套在线工具集&#xff0c;时间戳转换只是第一步。 欢迎试用...

flutter 项目调试、flutter run --debug调试模式 devtools界面说明

Flutter DevTools 网页界面说明 1. 顶部导航栏 Inspector&#xff1a;查看和调试 Widget 树&#xff0c;实时定位 UI 问题。Performance-- 性能分析面板&#xff0c;查看帧率、CPU 和 GPU 使用情况&#xff0c;识别卡顿和性能瓶颈。Memory-- 内存使用和对象分配分析&#xff…...

Qt C++实现马的遍历问题

在这个项目中,我们面对的是一个基于中国象棋的马的遍历问题,使用了C++编程语言,并结合了Qt5库来实现图形界面和棋盘的绘制。以下是这个项目涉及的关键知识点: 马的移动规则:马在象棋中具有独特的“日”字形移动方式,即每次可以向前、后、左或右移动一格,然后在同一行或同…...

web第六次课后作业--使用ApiFox实现请求响应操作

一、实体参数 1.1 简单实体参数 1.2 复杂实体对象 如果请求参数比较多&#xff0c;通过上述的方式一个参数一个参数的接收会比较繁琐。此时&#xff0c;我们可以考虑将请求参数封装到一个实体类对象中。 要想完成数据封装&#xff0c;需要遵守如下规则&#xff1a;请求参数名…...

第十周作业

一、CSRF 1、DVWA-High等级 2、使用Burp生成CSRF利用POC并实现攻击 二、SSRF&#xff1a;file_get_content实验&#xff0c;要求获取ssrf.php的源码 三、RCE 1、 ThinkPHP 2、 Weblogic 3、Shiro...

Excel合并单元格后,如何自动批量生成序号列

1.选择整列 2.组合键&#xff1a;CtrlG 3.定位条件&#xff0c;选择“空值” 4.在第一个框中输入“MAX(”&#xff0c;鼠标选中A1框&#xff0c;后加“&#xff1a;”&#xff0c;鼠标选中前方“A1”&#xff0c;按“F4”绝对引用&#xff0c;补全右括号&#xff0c;后输入“1…...

数据结构 -- B树和B+树

B树 B树 5叉查找树 最少1个关键字&#xff0c;2个分叉 最多4个关键字&#xff0c;5个分叉 如何保证查找效率 &#xff08;1&#xff09;eg.对于5叉排序树&#xff0c;规定除了根节点外&#xff0c;任意结点都至少有3个分叉&#xff0c;2个关键字 &#xff08;若每个结点内关…...

el-table高度自适应、数据查询后高度展示错误问题

在很多场景中我们需要实现表格的高度自适应&#xff0c;即不同屏幕大小下需要使用不同的高度来设置表格&#xff0c;那么我们应该如何实现呢&#xff1f; 1.el-table实现高度自适应 通过以下代码可以实现表格根据屏幕进行自适应 设置表格的高度 <el-table ref"tableD…...

unittest

1.什么是unittest&#xff1f; unittest是Python自带的一个单元测试框架, 它可以做单元测试, 也能用于编写和运行重复的测试工作。它给自动化测试用例开发和执行提供了丰富的断言方法, 判断测试用例是否通过, 并最终生成测试结果. 2.unittest组成 2.1 TestCase TestCase即测试…...

【Linux学习笔记】ext2文件系统的深度剖析

【Linux学习笔记】ext2文件系统的深度剖析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】ext2文件系统的深度剖析前言一.ext2文件系统1.1宏观认识 二. Block Group三. 块组内部构成3.1 超级块&am…...

Vue 3 官方 Hooks 的用法与实现原理

Vue 3 引入了 Composition API&#xff0c;使得生命周期钩子&#xff08;hooks&#xff09;在函数式风格中更清晰地表达。本篇文章将从官方 hooks 的使用、实现原理以及自定义 hooks 的结构化思路出发&#xff0c;全面理解 Vue 3 的 hooks 系统。 &#x1f4d8; 1. Vue 3 官方生…...

通过现代数学语言重构《道德经》核心概念体系,形成一个兼具形式化与启发性的理论框架

以下是对《道德经》的数学转述尝试&#xff0c;通过现代数学语言重构其核心概念&#xff0c;形成一个兼具形式化与启发性的理论框架&#xff1a; 0. 基础公理体系 定义&#xff1a; 《道德经》是一个动态宇宙模型 U(D,V,Φ)&#xff0c;其中&#xff1a; D 为“道”的无限维…...

openai-whisper-asr-webservice接入dify

openai-whisper-asr-webservice提供的asr的api其实并不兼容openai的api&#xff0c;所以在dify中是不能直接添加到语音转文字的模型中&#xff0c;对比了下两个api的传参情况&#xff0c;其实只要改动一处&#xff0c;就能支持&#xff1a; openai兼容的asr调用中formdata中音频…...

曾经在知乎上看到一个回答:“入职做FPGA,后续是否还可以转数字IC设计?”

曾经在知乎上看到一个回答&#xff1a;“入职做FPGA&#xff0c;后续是否还可以转数字IC设计&#xff1f;” 对比FPGA的行业薪资水平&#xff0c;数字IC行业中的一些基础性岗位薪资比FPGA要高一些。 除了薪资之外&#xff0c;更多FPGA开发者考虑转向数字IC设计的原因如下&…...

第4周_作业题_逐步构建你的深度神经网络

文章目录 ***逐步构建你的深度神经网络***0. 背景0.1 要解决的问题0.2 作业大纲0.3 构建深层神经网络步骤 1. 导入包2. 初始化参数2.1 2层神经网络2.2 L层神经网络 3. 前项传播函数3.1 前项传播步骤3.2 线性前向3.3 线性激活部分3.4 L层前项传播模型3.5 计算成本 4. 反向传播模…...

Linux 搭建FTP服务器(vsftpd)

搭建FTP服务器(vsftpd)&#xff1a; 文章目录 搭建FTP服务器(vsftpd)&#xff1a;配置镜像安装vsftpd配置vsftpd关闭SELinux&#xff1a;配置防火墙启动vsfptd服务并设置开机自启创建FTP用户测试windows中测试Linux测试下载get/mget上传put/mput删除文件delete 搭建SCP服务器(基…...

AWS中国区中API Gateway中403的AccessDeniedException问题

问题 在互联网使用API Gateway的域名访问接口&#xff0c;出现403问题AccessDeniedException。具体如下&#xff1a; 前提 这里API Gateway相关配置都没有问题。而且&#xff0c;vpc内网都能访问被代理的服务。这里api gateway不需要使用自定义域名。 解决 向客服发个工单…...

计量单片机 RN8302:特性、使用与应用

在现代电力监测与能源管理领域&#xff0c;精确的电能计量至关重要。计量单片机 RN8302 作为一款高性能的电能计量芯片&#xff0c;凭借其卓越的特性与功能&#xff0c;在众多应用场景中发挥着关键作用。本文将全面深入地介绍 RN8302 的各项特性、使用方法、注意事项以及广泛的…...

Flutter生物识别认证之Flutter指纹认证Flutter人脸认证

Flutter介绍&#xff1a; Flutter是谷歌开发的开源UI软件开发工具包&#xff0c;用于高效构建跨平台的应用程序&#xff0c;支持iOS、Android、Web、Windows、macOS和Linux。它使用Dart语言编写&#xff0c;提供了丰富的组件和工具&#xff0c;使开发者能够创建高质量、高性能…...

了解Android studio 初学者零基础推荐(2)

在kotlin中编写条件语句 if条件语句 fun main() {val trafficLight "gray"if (trafficLight "red") {println("Stop!")} else if (trafficLight "green") {println("go!")} else if (trafficLight "yellow")…...

【Java Web】1.Maven

&#x1f4d8;博客主页&#xff1a;程序员葵安 &#x1faf6;感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb; 文章目录 一、初始Maven 1.1 什么是Maven 1.2 Maven的作用 二、Maven概述 2.1 Maven模型 2.2 Maven仓库 2.3 创建Maven项目 2.4 POM配置…...

【Spark集成HBase】Spark读写HBase表

Spark读写HBase表 摘要一、实验环境准备1. 技术版本2. Maven 依赖配置 二、实验步骤1. 数据准备2. HBase 表结构设计3. 代码实现3.1 数据写入 HBase&#xff08;writeDataToHBase 方法&#xff09;3.2 数据读取与分析&#xff08;readHBaseData 方法3.3 Spark SQL 分析3.4 完整…...

【Linux】借助gcc源码修改,搜索头文件当前进展

从上图可以看出对于每次的搜索&#xff0c;都是从第一个目录开始搜索&#xff0c;图里也可以看到修改源代码所在的目录&#xff0c;函数&#xff0c;行&#xff0c;昨天的博客感觉对于找到的位置还是不太好。 在使用修改源代码编译的GCC&#xff0c;进行编译内核源代码时&#…...