IO(JavaEE初阶系列8)
目录
前言:
1.文件
1.1认识文件
1.2结构和目录
1.3文件路径
1.4文本文件vs二进制文件
2.文件系统的操作
2.1Java中操作文件
2.2File概述
2.2.1构造File对象
2.2.2File中的一些方法
3.文件内容的操作
3.1字节流
3.1.1InPutStream的使用方法
3.1.2OutPutStream的使用方法
3.2字符流
3.2.1Reader的使用方法
3.2.2Writer的使用方法
4.文件操作的案例
结束语:
前言:
在之前的博客中小编主要是与大家分享了多线程中的一些东西,在这节中小编就与大家分享一下IO方面一些知识吧!
1.文件
1.1认识文件
我们先来认识一下狭义上的文件,针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。那么我们平时谈到的“文件”,指的都是硬盘上的文件。
硬盘(外存)与内存相比:
- 速度:内存比硬盘快很多。
- 空间:内存空间比硬盘小。
- 成本:内存比硬盘贵。
- 持久化:内存掉电后数据丢失,外存掉电后数据还在。
像我们之前学习的java代码都是围绕着内存展开的,我们的JavaSE + 数据结构里面,定义一个变量,其实就是在内存上申请空间的。MYSQL主要就是操作硬盘。文件这里的IO也就是操作硬盘了,这里我们会学习文件的系统操作和文件的内容操作。在文件的系统操作里我们主要学习的是创建文件、删除文件、重命名文件、创建目录....。在文件的内容操作中我们主要学习的就是针对文件内容进行读和写的操作。 下面我们会给大家一一展开介绍的。
1.2结构和目录
计算机的目录是有层级结构的,在计算机中我们是把文件夹叫做目录。如下所示就是计算机中的一个层级目录展示,这里的目录太多了小编没有全部展示出来,大家只要明白就可以了。
通过上图我们可以看到文件系统是以树型结构来组织文件和目录的。他是一个N叉树。
1.3文件路径
文件路径:就是从树根结点出发,沿着树杈一路往下走,到达目标文件,此时这中间经过的内容就是文件的路径。
在Windows中都是从“此电脑”起头的,表示路径的时候,可以把“此电脑”省略,直接从盘符开始表示。如下所示就是一个文件的路径。
我们实际路径的表示是通过字符串表示的,每个目录之间使用 /(反斜杠)或者是 \(斜杠)来分隔。 如下所示:
D:\Java学习代码记录\JavaGitee代码提交\java-ee-elementary
上述的反斜杠只是在Windows中适用,代码中写需要写成\\,是需要转义字符的。
在上述的路径中我们可以看到我们都是从盘符开始往下寻找的文件路径,那么这种路径就叫绝对路径。如果是从给定的目录出发,一层一层往下找,这个过程得到的路径就叫相对路径。这里我们提到的给定的目录是基准目录也叫工作目录。那么工作目录又是啥,那么下来我们来具体看一下案例。
假设我们现在的工作目录是下面这个。
此时我们要找到的是
那么此时我们的相对路径表示就是:./JavaGitee代码提交/java-ee-elementary/JavaEE-2023.8.2
假设我们现在的工作目录是下面的这个:
那么此时我们要找的是这个:
那么此时我们的相对路径表示就是:./java-ee-elementary/JavaEE-2023.8.2/src/Main.java
在上述的相对路径表示法中我们看到 · 它是一个特殊符号,表示的是当前目录,还有一种是 ·· 也是一种特殊符号,表示的是目录的上级目录。
注意:
在文件系统上,任何一个文件对应的路径是唯一的,不会存在两个路径相同,但是文件不同的情况!!!在Linux中可能会存在一个文件有两个不同路径可以找到它,但是在Windows中可以认为路径和文件是一一对应的关系,路径就相当于是一个“文件”的身份标识。
1.4文本文件vs二进制文件
文本文件存储的是文本,文本都是由ASCII字符构成的,对于ASCII来说它的表示范围是0-127,由于不够表示我们所有的字符,后来就又搞了其他编码方式,例如utf-8之类的,就可以针对其他语言文字符号进行编码了。
二进制文件存储的是二进制数据,它是没有任何字符集的限制,存啥都行。
那么我们又该怎么判断存储的文本还是二进制呢?
一个简单的判定方式就是直接按照记事本的方式打开文件,如果可以看懂就说明是文本存储,如果看不懂就说明是二进制存储。如下例子所示:
下面的这种就是二进制文本:
下面这种能看懂的就是文本文件:
2.文件系统的操作
2.1Java中操作文件
在Java中通过java.io.File类来对一个文件(包括目录)进行抽象的描述。在Java标准库中给我们提供了一个类叫File类,File对象是硬盘上的一个文件的“抽象”表示。
这里的文件是存储在硬盘上的如果直接通过代码来操作硬盘,不太方便,就在内存中创建一个对应的对象,操作这个内存中对象,就可以间接的影响到硬盘的文件情况了。这就相当于是电视机和遥控器一样,这里的File就是遥控器可以操作硬盘。下面我们来具体看一下吧。
2.2File概述
2.2.1构造File对象
在我们构造的过程中可以使用绝对路径也可以使用相对路径进行初始化,这个路径指向的文件,可以是真实存在的,也可以是不存在的,下面我们用代码来具体给大家来演示一下。
2.2.2File中的一些方法
在File中给我们提供了很多方法,如下所示:
修饰符及返回值类型 | 方法签名 | 说明 |
String | getParent() | 返回File对象的父目录文件路径 |
String | getName() | 返回File对象的纯文件名称 |
String | getPath() | 返回File对象的文件路径 |
String | getAbsolutePath() | 返回File对象的绝对路径 |
String | exists() | 判断File对象描述的文件是否真实存在 |
boolean | isDirctory() | 判断File对象代表的文件是否是一个目录 |
boolean | isFile() | 判断File对象代表的文件是否是一个普通文件 |
boolean | createNewFile() | 根据File对象,自动创建一个空文件,成功创建后返回true |
boolean | delete() | 根据File对象,删除该文件,成功删除后返回true |
void | deleteOnExit() | 根据File对象,标注文件将被删除,删除动作会到JVM运行结束时才会进行 |
String[] | list() | 返回File对象代表的目录下的所有文件名 |
File[] | listFiles() | 返回File对象代表的目录下的所有文件,以File对象表示 |
boolean | mkdir() | 创建File对象代表的目录 |
boolean | mkdirs() | 创建File对象代表的目录,如果必要,会创建中间目录 |
boolean | renameTo(Filedest) | 进行文件改名,也可视为我们平时的剪切、粘贴操作 |
boolean | canRead() | 判断用户是否对文件有可读权限 |
boolean | canWrite() | 判断用户是否对文件有可写权限 |
下面就给大家来演示一下个别操作:
代码展示:
package io;import java.io.File;
import java.io.IOException;public class IODemo1 {public static void main(String[] args) throws IOException {//就可以通过File对象进行操作了File file = new File("./cat.jpg");//返回File对象的父目录文件路径System.out.println(file.getParent());//返回File对象的纯文件名称System.out.println(file.getName());//返回File对象的文件路径System.out.println(file.getPath());//返回File对象的绝对路径System.out.println(file.getAbsolutePath());//返回File对象的修饰过的绝对路径System.out.println(file.getCanonicalPath());}
}
结果展示:
由于idea的工作目录就是项目所在目录,所以当我们在新创建的时候就会在该项目的目录下。如下所示,在执行完代码之后我们就可看到在项目中多了一个“hello_world.txt”。
代码展示:
package io;import java.io.File;
import java.io.IOException;public class IODemo2 {public static void main(String[] args) throws IOException {//在相对路径中,./通常可以省略File file = new File("./hello_world.txt");System.out.println("创建文件之前:");//判断File文件是否存在System.out.println(file.exists());//判断File对象代表的文件是否是一个目录System.out.println(file.isDirectory());//判断File对象代表的文件是是否是一个普通文件System.out.println(file.isFile());System.out.println("创建文件之后:");//创建文件file.createNewFile();//判断File文件是否存在System.out.println(file.exists());//判断File对象代表的文件是否是一个目录System.out.println(file.isDirectory());//判断File对象代表的文件是是否是一个普通文件System.out.println(file.isFile());}
}
结果展示:
如果我们要删除目录呢?我们就可以使用delete操作来进行删除,如下所示。
代码展示:
package io;import java.io.File;
import java.io.IOException;public class IODemo2 {public static void main(String[] args) throws IOException {//在相对路径中,./通常可以省略File file = new File("./hello_world.txt");System.out.println("创建文件之前:");//判断File文件是否存在System.out.println(file.exists());//判断File对象代表的文件是否是一个目录System.out.println(file.isDirectory());//判断File对象代表的文件是是否是一个普通文件System.out.println(file.isFile());System.out.println("创建文件之后:");//创建文件file.createNewFile();//判断File文件是否存在System.out.println(file.exists());//判断File对象代表的文件是否是一个目录System.out.println(file.isDirectory());//判断File对象代表的文件是是否是一个普通文件System.out.println(file.isFile());//删除文件file.delete();System.out.println("删除文件之后:");System.out.println(file.exists());}
}
结果展示:
我们可以看到在工作目录中就不存在该文件了。
我们还可以通过File来创建目录。
代码展示:
package io;import java.io.File;public class IODemo3 {public static void main(String[] args) {File file = new File("test-dir/aaa/bbb");//只创建一级目录
// file.mkdir();//创建多级目录file.mkdirs();}
}
结果展示:
也可以使用File里的方法来返回目录下的文件名。
代码展示:
package io;import java.io.File;
import java.util.Arrays;public class IODemo4 {public static void main(String[] args) {File file = new File("test-dir");//返回File对象代表的目录下的所有文件名String[] results = file.list();System.out.println(Arrays.toString(results));//返回File对象代表的目录下的所有文件,以File对象表示File[] results2 = file.listFiles();System.out.println(Arrays.toString(results2));}
}
结果展示:
还可以个对象重命名。
代码展示:
package io;import java.io.File;public class IODemo5 {public static void main(String[] args) {//重命名File src = new File("./test-dir");File dest = new File("./test222");src.renameTo(dest);}
}
结果展示:
3.文件内容的操作
针对文本文件,提供了一组类,统称为“字符流”(典型的代表是:Reader,Writer),它基本的读写单位是字符。
针对二进制文件,提供了一组类,统称为“字节流”(典型代表:InputSteam,OutputStream),它基本的读写单位是字节。
针对于上述“流”这个概念在英文中写作“Steam”,如果让你从文件中读取100个字节的数据,你的读法就会有很多种,可能一次读取一个字节,分100次读完,也可能会读取2个字节分50次读完,就这样像水流一样不断地读取数据。
针对于流对象,又分成两种:
- 输入的:Reader,InputSteam
- 输出的:Writer,OutPutSteam
这里就需要我们分清楚从哪里是输入,从哪里到哪里又是输出。下面我们可以画图来理解一下。
下面我们就来分别给大家讲解一下字符流和字节流中的几个重要的用法。
3.1字节流
3.1.1InPutStream的使用方法
InputStream是用来IO操作的,IO不仅仅是读写硬盘的文件,它还可以用来读写别的,这个后面在学习网络编程的时候会给大家交代。
在后面的括号中我们要指定一个要读的文件的路径。
这里可能就有同学好奇了,为什么在实例化的时候不是直接new 一个 InputStream呢?这里给大家解释一下,我们可以看到在InputStream的原码中是一个抽象类,抽象类是不能够实例化的。所以就出现了上述代码new了一个FileInputStream的情况。
这里我们在D盘中先新建一个文件命名为test.txt,并在里面编写一些文字。
下面我们就来使用一下InputStream。
这里的意思就是让这个变量能够和硬盘上的文件关联起来,此时就相当于有了遥控器。
但是此时读取完毕之后一定要记得关闭资源。
注意:这个关闭操作非常重要,这个操作如果忘记的话,可能就会导致文件资源泄漏。
所以为了保证一定可以执行到关闭操作,我们可以借助finally来做。如下所示:
package io;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;public class IODemo7 {public static void main(String[] args) throws IOException {InputStream inputStream = null;try {inputStream = new FileInputStream("d:/Java学习代码记录/JavaGitee代码提交/java-ee-elementary/test.txt");} finally {inputStream.close();}}
}
虽然这样也可以实现,并且可以保证一定可以执行到关闭操作的代码,但是我们并不提倡这样写,因为代码风格不太好,那么我们可以使用下面的这个操作来写。写好创建实例代码之后,然后按住Ctrl+Alt+T,然后选中下面的带有资源的try操作即可。在try结束之后就会自动执行close操作,这样就可以保证代码会执行close操作了。
下面我们就可以读取test.txt文件里面的内容了。
代码展示:
package io;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;public class IODemo8 {public static void main(String[] args) throws IOException {try (InputStream inputStream = new FileInputStream("d:/Java学习代码记录/JavaGitee代码提交/java-ee-elementary/test.txt")) {//读文件//read一次返回的是一个字节,但是此处的返回类型是intwhile (true) {int b = inputStream.read();if (b == -1) {//读到末尾了,结束循环即可break;}System.out.printf("%x\n",b);}}}
}
结果展示:
3.1.2OutPutStream的使用方法
代码展示:
package io;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class IODemo9 {public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("d:/Java学习代码记录/JavaGitee代码提交/java-ee-elementary/test.txt")) {outputStream.write(97);outputStream.write(98);outputStream.write(99);}}
}
结果展示:
3.2字符流
3.2.1Reader的使用方法
我们和上述的操作是一样的,首先先创建对象然后打开指定的路径。然后再进行读文件的操作,最后在关闭文件,这里的同样使用的是资源的try操作来进行关闭资源。这里我们从test.txt文件读取数据。
代码展示:
package io;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class IODemo10 {public static void main(String[] args) throws FileNotFoundException {try (Reader reader = new FileReader("d:/Java学习代码记录/JavaGitee代码提交/java-ee-elementary/test.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.2.2Writer的使用方法
与上述几个的使用方式都是一样的,这里小编就直接给大家来展示一下代码的实现吧。
代码展示:
package io;import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class IODemo11 {public static void main(String[] args) throws IOException {try (Writer writer = new FileWriter("d:/Java学习代码记录/JavaGitee代码提交/java-ee-elementary/test.txt")) {writer.write(65);writer.write(66);writer.write(67);}}
}
结果展示:
4.文件操作的案例
案例1:扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)。
这个就相当于是遍历目录,在里面的文件内容中查找。类似于检索操作。
这里我们直接写一个简单粗暴的办法:
- 先去递归的遍历目录,比如给定一个d:/去递归的把这里包含的所有文件都列出来。
- 每次找到一个文件,都打开,并读取文件内容(得到String)。
- 在判断要查找的词,是否在上述文件内容中存在,如果存在,结果即为所求。
代码展示:
package io;import java.io.*;
import java.util.Scanner;public class IODemo12 {public static void main(String[] args) throws FileNotFoundException {Scanner scanner = new Scanner(System.in);//1.先让用户指定一个要搜索的根目录System.out.println("请输入要扫描的根目录:");File rootDir = new File(scanner.next());if (!rootDir.isDirectory()){System.out.println("输入有误,您输入的目录不存在!");return;}//2.让用户输入一个要查找的词System.out.println("请输入要查找的词:");String word = scanner.next();//3.递归的进行目录/文件的遍历scanDir(rootDir,word);}private static void scanDir(File rootDir, String word) throws FileNotFoundException {//列出当前的rootDir中的内容,没有内容,直接递归结束File[] files = rootDir.listFiles();if (files == null) {//当前rootDir是一个空目录,这里啥都没有//没必要在进行递归了return;}//目录里有内容,就遍历目录中的每个元素for (File f : files) {System.out.println("当前搜索到的结果是:" + f.getAbsolutePath());if (f.isFile()) {//是普通文件//打开文件,读取内容,比较看是否包含上述的关键字String content = readFile(f);if (content.contains(word)){System.out.println(f.getAbsolutePath() + "包含要查找的关键字!");}} else if (f.isDirectory()) {//是目录//进行递归操作scanDir(f,word);}else {//不是普通文件,也不是目录文件,直接跳过continue;}}}private static String readFile(File f) throws FileNotFoundException {//读取文件的整个内容,返回出来//使用字符流来读取,由于咱们匹配的是字符串,此处只能按照字符流处理,才是有意义的StringBuilder stringBuilder = new StringBuilder();try (Reader reader = new FileReader(f)) {//一次读取一个字符,把读到的结果给拼装到stringBuilder中,同一转换成Stringwhile (true) {int c = reader.read();if (c == -1){break;}stringBuilder.append((char) c);}} catch (IOException e) {e.printStackTrace();}return stringBuilder.toString();}
}
结果展示:
结束语:
这节中小编主要是与大家介绍了文件中的IO操作,希望这节对大家了解文件的IO操作有一定帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)
相关文章:

IO(JavaEE初阶系列8)
目录 前言: 1.文件 1.1认识文件 1.2结构和目录 1.3文件路径 1.4文本文件vs二进制文件 2.文件系统的操作 2.1Java中操作文件 2.2File概述 2.2.1构造File对象 2.2.2File中的一些方法 3.文件内容的操作 3.1字节流 3.1.1InPutStream的使用方法 3.1.2OutPu…...

React Native 样式表的基础知识
在 React Native 中我们要使用组件元素进行样式设置的话,我们需要使用StyleSheet组件才能制定样式。useColorScheme是为 APP 定义颜色主题的。在此笔记中我们只是简单做一个介绍和使用。 使用StyleSheet定义样式 当我们要使用StyleSheet的话,我们需要引…...

【JS 解构赋值】
JS 解构赋值是 ES6 中一种简洁、高效的赋值方式,它可以将数组和对象中的值拆分出来并赋值给变量。 解构赋值 解构数组解构对象嵌套解构结语 解构数组 解构数组时,需要使用方括号 [] 包围变量名,并用逗号 , 将变量名隔开。 let [a, b, c] …...

Vue3状态管理库Pinia——自定义持久化插件
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...

il汇编整数相加
在这里尝试了IL汇编字符串连接; IL汇编字符串连接_bcbobo21cn的博客-CSDN博客 下面来看一下IL汇编整数相加; 大概的看一下一些资料,下面语句, ldc.i4 20 ldc.i4 30 add 看上去像是,装载整数20到一个类似于…...

RabbitMQ 事务
事务简介 就像我们了解的MySQL中的事务一样,RabbiMQ的事务也具备原子性和一致性,并且RabbiMQ的事务是针对消息从生产者发送到RabbitMQ中提供的支持,因此不同事务可以同时给同一个队列发送信息。 可通过channel.txSelect,chann…...

vue前端 让年月日 加上23:59:59
yyyy/MM/dd HH:mm:ss 格式 // 获取 lateCreateTime 的原始时间戳 const timestamp new Date(this.queryAO.lateCreateTime).getTime();// 将时间戳转换为指定格式的字符串 const formattedDateTime new Date(timestamp).toLocaleString("zh-CN", {year: "num…...

【雕爷学编程】Arduino动手做(186)---WeMos ESP32开发板8
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…...

STM32--综述
文章目录 前言STM32简介STM32F103C8T6系统结构Keil软件安装注意事项新建工程操作流程 前言 本专栏将学习B站江协科技的STM32入门教程,通过自身理解和对老师的总结所写的博客专栏。 STM32简介 STM32是意法半导体(STMicroelectronics)公司推…...

Linux学习之sed、awk和vim的差异
sed、awk和vim都是编辑器,区别如下: vim是交互式,需要跟用户进行互动,而sed和awk是非交互式,只需要写好命令,不用跟用户进行互动就可以完成任务。 vim是文本编辑器,操作的时候会对整个文件编辑&…...

MacOS上配置docker国内镜像仓库地址
背景 docker官方镜像仓库网速较差,我们需要设置国内镜像服务 我的MacOS docker版本如下 设置docker国内镜像仓库地址 点击Settings点击Docker Engine修改配置文件,添加registry-mirrors {"builder": {"gc": {"defaultKeepS…...

全志F1C200S嵌入式驱动开发(soc系统集成)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 任何一个嵌入式设备都是由很多的子系统组成的。这里面有硬件、有软件,还可能有机械,并不一定就是大家看到的消费电子那样,即一个soc构成了所有的系统。现实情况是,要构建一个系…...

React路由5版本
什么是路由? 一个路由就是一个映射关系(key:value). 以下代码用的都是router5 通过 npm install react-router-dom5 下载 所有路由用到的东西都需要从react-router-dom中引入 import {BrowserRouter,Link,Route,NavLink,Redirect,withRouter} from react-router-dom 1. 路…...

6.4.3 1x1卷积层
特点:1x1卷积层相当于全连接层 作用:1x1卷积用于调整网络层的通道数量和控制模型复杂度 输入形状:(通道,行,列) (3,3,3) 卷积核形状:(输出通道,输入通道,行,列) (2,3,…...

[CKA]考试之检查可用节点数量
由于最新的CKA考试改版,不允许存储书签,本博客致力怎么一步步从官网把答案找到,如何修改把题做对,下面开始我们的 CKA之旅 题目为: Task 检查集群中有多少节点为Ready状态(不包括被打上 Taint࿱…...

备考错题知识点总结
错题知识点总结 强化一,错题,范围管理,128题目 1 强化练习题 1 不理解的题目 4 什么玩意? 读不懂 你正在与产品负责人一起确定可行的产品迭代计划。 当你讨论各种特性并确定它们的优先级时,你们都在努力理解哪些特…...

初识Flask:Python轻量级Web框架入门教程
Flask是一个用Python编写的轻量级Web应用框架。由于其“微”性质,Flask在提供核心服务的同时,仍然提供了许多扩展的可能性。在这篇文章中,我们将从最基础开始,学习如何使用Flask构建一个Web应用。 一、安装与初次启动 首先&…...

【BASH】回顾与知识点梳理(七)
【BASH】回顾与知识点梳理 七 七. 前六章知识点总结及练习7.1 总结7.2 练习 该系列目录 --> 【BASH】回顾与知识点梳理(目录) 七. 前六章知识点总结及练习 7.1 总结 由于核心在内存中是受保护的区块,因此我们必须要透过『 Shell 』将我…...

Python实现对IP网段的快速检测
前言 本文是该专栏的第33篇,后面会持续分享python的各种干货知识,值得关注。 在工作上可能会遇到这样的需求,需要你对某个IP地址的网段进行批量检测。将可用和不可用IP批量筛选出来,尤其是在爬虫项目中,对于IP可用性的检测需求较多。 那么在python中,有没有方法可以快速…...

伪操作、C和汇编、ATPCS协议
一、伪操作.global 全局.local 局部.equ 声明.macro 子函数.if .endif 条件编译.rept 重复操作.weak 弱化.word 申请一个字空间.byte 申请一个字节空间.align 地址对齐.arm ARM指令.thumb Thumb指令.text 代码段.data 数据段.space 申请N个字节空间 二、C和汇编的混合编程三、A…...

OPENCV C++(五)滤波函数+sobel边缘检测+人脸磨皮mask
滤波函数 中值滤波 medianBlur(frame, detectmat, 5); 平均滤波 blur(frame, detectmat, Size(5, 5)); 高斯滤波(最后一个是方差 越大越模糊) GaussianBlur(frame, detectmat, Size(5, 5),0); sobel的边缘检测函数 Sobel(gray, dx, CV_16S, 1, 0, 3…...

20天突破英语四级高频词汇——第②天
20天突破英语四级高频词汇~第2天加油(ง •_•)ง💪 🐳博主:命运之光 🌈专栏:英语四级高频词汇速记 🌌博主的其他文章:点击进入博主的主页 目录 20天突破英语四级高…...

【Python 学习】第一个python案例
Python的ATM机Demo 一、需要安装python环境(略) 二、ATM源码 # 初始化全局余额 money 5000# 定义初始化界面菜单函数def menu(name):"""主页面-主菜单 返回用户选择的菜单:param name: 用户名称:return: 返回菜单类型"""print(f"{name}…...

【C#学习笔记】值类型(2)
文章目录 Struct结构体类型为什么不推荐struct 元组类型可为空的值类型从可为空的值类型转换为基础类型提升的运算符如何确定可为空的值类型为什么建议少用T?装箱和取消装箱 Struct结构体类型 结构类型(“structure type”或“struct type”)是一种可封…...

【设计模式】-建造者模式
Java建造者模式:创建复杂对象的灵活构建者 在软件开发中,我们经常遇到需要创建一个复杂对象的情况。如果使用传统的构造函数进行对象创建,可能会导致构造函数参数过多,难以管理和维护。建造者模式(Builder Pattern&am…...

【N32L40X】学习笔记14-在RT-thread系统中读取eeprom数据
eeprom 说明 eeprom介绍 AT24C01A,1K串行EEPROM:内部组织16页8字节,1K需要一个7位数据字地址进行随机字寻址。AT24C02,2K串行EEPROM:内部组织32页8字节,2K需要一个8位数据字地址进行随机字寻址。AT24C04,4K串行EEPRO…...

Python OpenCV读取并显示USB UVC摄像头
1. 安装Python, 略。 2. 安装 OpenCV: pip install opencv-python 3. 预览摄像头画面脚本: import cv2cap cv2.VideoCapture(0, cv2.CAP_DSHOW)if not (cap.isOpened()):print("Could not open video device")cap.set(cv2.CAP_PR…...

针对高可靠性和高性能优化的1200V碳化硅沟道MOSFET
目录 标题:1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance摘要信息解释研究了什么文章创新点文章的研究方法文章的结论 标题:1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance 摘要 本文详…...

在服务器上搭建gitlab
最终效果展示: 官方文档: 安装部署GitLab服务 1.在服务器上下载gitlab wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.9.0-ce.0.el7.x86_64.rpm rpm -ivh gitlab-ce-12.9.0-ce.0.el7.x86_64.rpm 2.编辑站点位置 vim …...

Amazon Aurora Serverless v2 正式发布:针对要求苛刻的工作负载的即时扩展
我们非常兴奋地宣布,Amazon Aurora Serverless v2 现已面向 Aurora PostgreSQL 和 MySQL 正式发布。Aurora Serverless 是一种面向 Amazon Aurora 的按需自动扩展配置,可让您的数据库根据应用程序的需求扩展或缩减容量。 亚马逊云科技开发者社区为开发者…...