JAVA文件I/O
目录
一、三种路径的分类:
1、绝对路径:
2、相对路径:
3、基准目录:
二、文件的种类:
三、利用JAVA操作文件:
1、File类的构造方法:
2、File 类方法的使用:
使用例子:
四、利用JAVA操作文件内容:
1、字节流:
读取操作:
实例化对象:
FileInputStream 核心方法:
输出操作:
实例化对象
FileOutputStream 核心方法:
2、字符流:
读取操作:
实例化对象:
FileReader 核心方法:
输出操作:
实例化对象:
FileWriter 核心方法:
五、使用文件操作的案例:
1、根据用户输入的目录和文件名,来进行文件的查找和删除
2、基根据用户输入的源文件路径,复制源文件到指定目录
一、三种路径的分类:
1、绝对路径:
绝对路径是从文件系统的根目录开始,完整地描述文件或目录位置的路径。
例如,在windows系统中,有个具体文件是 report.txt :
c:\User\user\docs\report.txt
2、相对路径:
相对路径不包含完整的路径信息,而是根据当前工作目录来确定目标文件或目录的位置。
( . ) :表示当前目录。例如,.\example.txt 表示当前目录下的example.txt 文件。
( .. ) :表示上级目录。例如,..\Documents\example.txt 表示当前目录的上级目录下的Documents文件夹的 example.txt 文件。
假如当前目录是home,..\..\表示的是当前home目录的上上级目录。
例子,假设当前的工作目录是 john,目标文件是c:\home\john\Documents\example.txt 。
绝对路径:c:\home\john\Documents\example.txt 。
相对路径:.\Documents\example.txt 。
在实际的开发中,绝对路径和相对路径用到的会更多。(尤其是相对路径,用的会更多)。
3、基准目录:
基准路径也就是当前工作目录。
基准路径 + 相对路径 = 绝对路径。
基准路径是指当前程序或者操作所基于的目录。在进行文件操作时,相对路径的计算就以这个基准路径为起点。例如,若基准路径是c:\User\john,相对路径Documents\example.txt (省略了前面的 .\ )就表示的绝对路径是 c:\User\john\Documents\example.txt 。
二、文件的种类:
文件分为两大类:文本文件 和 二进制文件 。
判断当前文件是文本文件还是二进制文件,初步手段是把文件拖入记事本里,如果是乱码就是二进制文件。反之是文本文件。(此方法有局限性)。
特性 | 文本文件 | 二进制文件 |
底层存储 | 由可读字符组成,使用字符编码(如 ASCII、UTF-8) | 由任意二进制数据组成(0 和 1 的序列),无需遵循字符编码规则。 |
人类可读性 | 可直接用文本编辑器查看和编辑(如记事本)。 | 无法直接阅读(显示为乱码),需专用程序解析。 |
文件示例 | .txt , .csv , .html , .py | .exe , .jpg , .mp3 , .docx |
三、利用JAVA操作文件:
在JAVA中,我们使用 File 类和进行文件的操作:
File类主要作用于文件或目录,它不仅可以用于创建文件和目录,还能进行一些与文件和目录相关的操作,比如获取文件或目录的属性、删除文件或目录等。
1、File类的构造方法:
注意,由于 .\ 会发生转移字符的情况,所以使用 ./ 也可以(windows支持)。
有两种方法构造 File 类实例比较常用:
第一种( File(String pathname) ):
通过指定的路径名字符串创建一个 File 实例。这个路径名可以是绝对路径,也可以是相对路径。
// 使用绝对路径创建 File 对象File absoluteFile = new File("C:/Users/example.txt");// 使用相对路径创建 File 对象File relativeFile = new File("./test.txt");
absoluteFile
依据绝对路径构建,而 relativeFile
则是基于相对路径构建,相对路径是相对于当前工作目录而言的。
第二种( File(String parent , String child ) ):
根据父路径名字符串和子路径名字符串创建一个 File 实例。系统会将父路径和子路径拼接起来,形成完整的路径。
String parent = "C:/Users";String child = "./example.txt";File file = new File(parent, child);
parent 代表父路径,child 代表子路径,二者组合后生成完整路径 c:/Users/example.txt 。
2、File 类方法的使用:
修饰符及返回值类型 | ⽅法签名 | 说明 |
String | getParent() | 返回 File 对象的父⽬录⽂件路径 |
String | getName() | 返回 FIle 对象的纯⽂件名称 |
String | getPath() | 返回 File 对象的⽂件路径 |
String | getAbsolutePath() | 返回 File 对象的绝对路径 |
String | getCanonicalPath() | 返回 File 对象的修饰过的绝对路径 |
boolean | exists() | 判断 File 对象描述的⽂件是否真实存在 |
boolean | isDirectory() | 判断 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(File dest) | 进⾏⽂件改名,也可以视为我们平时的剪切、粘贴操作 |
boolean | canRead() | 判断⽤⼾是否对⽂件有可读权限 |
boolean | canWrite() | 判断⽤⼾是否对⽂件有可写权限 |
使用例子:
我的 java 工程目录:
例子1:
File file = new File("./test.txt");System.out.println(file.getParent());System.out.println(file.getName());System.out.println(file.getPath());System.out.println(file.getAbsolutePath());System.out.println(file.getCanonicalPath());System.out.println(file.exists());System.out.println(file.isDirectory());System.out.println(file.isFile());
代码运行结果(结合上面表格方法介绍看):
例子2:
File file = new File("./test.txt");// 创建文件,成功创建返回true,若存在返回falsefile.createNewFile();// 进程退出之后(代码运行结束), 才触发删除.file.deleteOnExit();Scanner scanner = new Scanner(System.in);System.out.println("输入任意内容, 退出程序");scanner.next(); // 阻塞
代码运行结果(结合上面表格方法介绍看):
再看我们当前的工作目录:(test.txt文件已被删除)
例子3:
File file = new File("./");System.out.println(Arrays.toString(file.list()));System.out.println(Arrays.toString(file.listFiles()));
代码运行结果(结合上面表格方法介绍看):
例子4:
File file = new File("./test/aaa/bbb");// 创建一级目录System.out.println(file.mkdir()); // false
./test/aaa/bbb
是指定的路径。其中 ./
代表当前目录,整体意思是要在当前目录下的 test
目录中的 aaa
目录里创建 bbb
目录。
如果当前目录下已经有 test
目录,并且 test
目录下有 aaa
目录,而 aaa
目录中没有 bbb
目录,那么 mkdir()
方法会成功创建 bbb
目录,并且返回 true
。
要注意的是,如果当前目录下没有test 目录,或者 test 目录下没有aaa目录,mkdir()
方法无法创建父目录,也就不能创建 bbb
目录,此时会返回 false
。(因为我的工作目录没有当前的test目录)。
例子5:
File file = new File("./test/aaa/bbb");// 创建多级目录file.mkdirs();
mkdirs()这个方法,它会检查路径中各级目录是否存在,若不存在就会依次创建这些目录。例如,如果 test
目录不存在,它会先创建 test
目录;接着检查 aaa
目录,若不存在就创建 aaa
目录;最后检查并创建 bbb
目录。
例子6:
我的工程目录:
File file = new File("./test/test.txt");File file2 = new File("./hello.txt");file.renameTo(file2);
此时test目录下的test.txt文件已经没了。
这里实现了两个操作。
一是把 当前工作目录下的 test 目录 里的test.txt文件名字改为hello.txt,二是把名字改成 hello.txt 的文件移动到当前工作目录下。
但是如果当前目录存在hello.txt文件,调用 file.renameTo(file2)
方法进行重命名和移动操作时会失败,renameTo()
方法会返回 false
。
四、利用JAVA操作文件内容:
在 Java 里,操作文件内容时,有字节流和字符流两种不同的输入输出方式。
字节流:
以字节(Byte)作为处理单位。一个字节为 8 位(bit),可处理任意类型的文件,像图片、音频、视频等二进制文件,也能处理文本文件。
字符流:
以字符(Character)作为处理单位。在 Java 中,一个字符通常是 16 位(2 字节),采用 Unicode 编码,适合处理文本文件,能直接处理字符数据,避免了字节流处理文本时的编码转换问题。
1、字节流:
读取操作:
使用 InputStream 类来读取,但时,InputStream 是一个抽象类,它是所有字节输入流类的超类(超类是一种位于继承层次结构较高位置的类,其他类可以从它继承属性和方法),不能直接实例化,通常需要使用它的具体子类来完成实例化。
实例化对象:
我们使用 FileInputStream 这个类来创建实例对象:
第一种:( FileInputStream( String name ) )
InputStream inputStream = new FileInputStream("./test.txt");
在上述代码中,使用 FileInputStream("./test.txt")
创建了一个输入流对象,用于读取当前目录下的 test.txt
文件。如果文件不存在,会抛出 FileNotFoundException
异常。
第二种:( FileInputStream( File file ) )
File file = new File("./test.txt");
InputStream inputStream = new FileInputStream(file);
此代码先创建了一个 File
对象,然后使用 FileInputStream(file)
创建输入流对象。用于读取当前目录下的 test.txt
文件。如果文件不存在,会抛出 FileNotFoundException
异常。
FileInputStream 核心方法:
方法 | 说明 |
int read( ) | 此方法从输入流一次读取读取一个字节的数据,并将其作为一个 0 到 255 之间的整数返回。若到达输入流的末尾,返回 -1 。 |
int read(byte[ ] b) | 尝试从输入流中读取最多 b.length 个字节的数据,并将其存储在字节数组 b 中。返回实际读取的字节数。若到达输入流的末尾,返回 -1 。 |
int read(byte[ ] b, int off, int len) | 从输入流中读取最多 len 个字节的数据,并将其存储在字节数组 b 中,从索引 off 开始存储。返回实际读取的字节数。若到达输入流的末尾,返回 -1 |
使用例子1:
InputStream inputStream = new FileInputStream("./test.txt");int data;while ((data = inputStream.read()) != -1) {System.out.print((char) data);}// 读取完毕, 循环 break 之后, 需要关闭文件.inputStream.close();
上述代码中,(data = inputStream.read()) 这个表达式的结果就是赋给 data 的值,通过 while
循环不断调用 read()
方法读取文件内容,直到返回 -1
表示文件读取完毕。每次读取的字节数据被转换为字符并输出。
使用例子2:
InputStream inputStream = new FileInputStream("./test.txt");while (true) {byte[] bytes = new byte[1024];int n = inputStream.read(bytes);if (n == -1) {// 读取完毕了.break;}// 处理读取到的数据for (int i = 0; i < n; i++) {System.out.print((char)bytes[i]);}}// 读取完毕, 循环 break 之后, 需要关闭文件.inputStream.close();
当文件剩余字节数大于字节数组长度,read方法就会尝试读取 bytes.length 个字节到 bytes 数组中,并返回 bytes.length 个字节个数给到 n 。
当文件剩余字节数小于或等于字节数组长度,返回当前的有效字节的个数,再下一次循环就返回-1。
使用例子3:
InputStream inputStream = new FileInputStream("./test.txt");byte[] buffer = new byte[1024];int offset = 0;int length = 512;int bytesRead;while(true) {bytesRead = inputStream.read(buffer, offset, length);if(bytesRead == -1) {//读取完毕了.break;}// 处理读取到的数据for (int i = offset; i < offset + bytesRead; i++) {System.out.print((char) buffer[i]);}//下一次获取文件字节起始位置offset += bytesRead;}// 读取完毕, 循环 break 之后, 需要关闭文件.inputStream.close();
此read方法从文件中最多读取len个字节的数据,从索引 offset 处开始存储,同理,与上述的例子2一样,读取到文件,末尾返回-1。
输出操作:
使用 OutputStream 类来输出,但时,OutputStream 是一个抽象类,不能直接实例化,通常需要使用它的具体子类来完成实例化。
实例化对象
我们使用 FileOutputStream 这个类来创建实例对象。
第一种:( FileOutputStream(Sting name) )
OutputStream fos = new FileOutputStream("./test.txt");
name 就是要打开的具体文件路径和文件名称。
第二种:( FileOutputStream(Sting name , boolean append) )
OutputStream fos = new FileOutputStream("./test.txt", true);
name 就是要打开的具体文件路径和文件名称。
append 如果为true,则将字节数据从文件末尾处开始写入;如果为false,则会覆盖原文件内容。
FileOutputStream 核心方法:
方法 | 解释 |
write ( int a) | 写⼊要给字节的数据 |
write(byte[ ] b) | 将字符数组 b 中的数据全部写入文件中 |
write(byte[ ] c , int off, int len) | 将 c 这个字符数组中从 off 开始的 数据写⼊文件 中,⼀共写 len 个 |
flush() | 我们知道 I/O (可以理解为从磁盘读取数据和把数据写入磁盘)的速度是很慢的,所以,⼤多的 OutputStream 为了减少设备操作的次数,在写数 据的时候都会将数据先暂时写⼊内 存的⼀个指定区域⾥,直到该区域 满了或者其他指定条件时才真正将 数据写⼊设备中,这个区域⼀般称 为缓冲区。但造成⼀个结果,就是 我们写的数据,很可能会遗留⼀部 分在缓冲区中。需要在最后或者合适的位置,调⽤ flush(刷新)操 作,将数据刷到设备中。 |
使用例子:
OutputStream fos = new FileOutputStream("./test.txt");int a = 'A';fos.write(a);byte[] arr = {'a',68,69};fos.write(arr);//刷新缓冲区fos.flush();
写入后,对应文件的内容。
2、字符流:
读取操作:
基于 Reader 这个抽象类来进行字符流读取,不能直接实例化,通常需要使用它的具体子类来完成实例化。
实例化对象:
使用 FileReader 这个子类来进行实例化:
第一种:( FileReader(String name) )
Reader reader = new FileReader("./test.txt")
name 为具体的文件路径和文件名称。
第二种:( FileReader(File file) )
File file = new File("./test.txt");
Reader reader = new FileReader(file);
指定的 File
对象创建一个新的 FileReader
对象。若指定的 File
对象表示的文件不存在、是一个目录而非普通文件,或者由于其他原因无法打开该文件,会抛出 FileNotFoundException
异常。
FileReader 核心方法:
方法 | 介绍 |
int read( ) | 读取单个字符,返回一个 0 到 65535 之间的整数,表示读取的字符。 如果已经到达流的末尾,则返回 -1。 |
int read(char[ ] arr ) | 将字符读入数组,返回读取的字符数。 如果已经到达流的末尾,则返回 -1。 |
int read(char[ ] arr , int off , int len) | 将字符读入数组的一部分,数组从偏移量 返回实际读取的字符数。 如果已经到达流的末尾,则返回 -1。 |
使用例子1:
文件含有内容:
Reader reader = new FileReader("./test.txt");while (true) {int ch = reader.read();if (ch == -1) {break;}char c = (char) ch;System.out.println(c);}
运行结果:
使用例子2:
文件含有内容:
Reader reader = new FileReader("./test.txt");while (true) {char[] chars = new char[1024];int n = reader.read(chars);if (n == -1) {break;}for (int i = 0; i < n; i++) {System.out.println(chars[i]);}}
运行结果:
输出操作:
使用 Writer 类来输出,因为它是抽象类,所以不能直接实例化,通常要使用它的具体子类来完成实际的字符写入操作。
实例化对象:
使用 FileWriter 这个子类来实例化对象。
第一种:( FileWriter(String name) )
Writer writer = new FileWriter("./test.txt");
name 就是要打开的具体文件路径和文件名称。
第二种:( FileWriter(File file ,boolean append) )
Writer writer = new FileWriter("./test.txt", true);
name 就是要打开的具体文件路径和文件名称。
append 如果为true,则将字节数据从文件末尾处开始写入;如果为false,则会覆盖原文件内容。
FileWriter 核心方法:
方法 | 解释 |
write( ) | 写入单个字符,或者字符串 |
write(char[ ] arr ) | 将字符数组中的所有字符写入文件。 |
write(char[ ] arr ,int off , int len) | 将字符数组的 off 位置开始写入,最多写入 len 个 |
flush( ) | 刷新缓冲区 |
使用例子:
Writer writer = new FileWriter("./test.txt");writer.write("你好世界");char[] arr = {'z','k'};writer.write(arr);writer.flush();
代码运行结果:
五、使用文件操作的案例:
1、根据用户输入的目录和文件名,来进行文件的查找和删除
public static void main(String[] args) {//用户输入要查询的文件名Scanner scanner = new Scanner(System.in);System.out.println("温馨提示,输入的目录要符合d:/ 或者 d:/User/...的格式");System.out.println("请输入要查询的目录: ");String dir = scanner.nextLine();System.out.println("请输入要查询的文件名: ");String filename = scanner.nextLine();//判断目录是否存在File rootFile = new File(dir);if(!rootFile.isDirectory()) {System.out.println("目录不存在!");return;}//进行搜索,递归遍历目录中所有的文件和子目录scanDir(rootFile,filename);}private static void scanDir(File rootFile, String filename) {//列出 rootFile 中的内容File[] files = rootFile.listFiles();if(files == null) {//空目录return;}//遍历 files 数组,判断每个元素的类型for (File file : files) {if(file.isDirectory()) {//是一个目录,递归调用 scanDir 方法.scanDir(file,filename);}else if(file.isFile()) {//是一个文件,判断文件名是否匹配。if(file.getName().contains(filename)) {tryDelete(file);}}}}private static void tryDelete(File file) {System.out.println("已找到改文件,文件路径为:" + file.getAbsolutePath());System.out.println("是否删除该文件(Y/N)");Scanner scanner = new Scanner(System.in);String choice = scanner.next();if(choice.equals("Y") || choice.equals("y")) {file.delete();System.out.println("删除成功!");}}
进阶版:
public class Demo25 {//记录文件是否存在public static boolean count = true;public static void main(String[] args) {while(true) {// 每次查找前重置 count 变量count = true;//用户输入要查询的文件名Scanner scanner = new Scanner(System.in);System.out.println("此程序用来进行文件的查找和删除");System.out.println("温馨提示,输入的目录要符合d:/ 或者 d:/User/...的格式");System.out.println("请输入要查询的目录: ");String dir = scanner.next();scanner.nextLine();System.out.println("请输入要查询的文件名(文件名可以是部分名称): ");String filename = scanner.next();scanner.nextLine();//判断目录是否存在File rootFile = new File(dir);if(!rootFile.isDirectory()) {System.out.println("目录不存在!");System.out.println();continue;}//进行搜索,递归遍历目录中所有的文件和子目录scanDir(rootFile,filename);if(count == true) {System.out.println("文件不存在,或者文件名输入错误!");}System.out.println("输入 1 继续查找,输入 0 退出程序");int a = 0;while(true) {if(scanner.hasNextInt()) {a = scanner.nextInt();if(a == 1) {break;}else if(a == 0) {return;}else {System.out.println("输入的数字无效,请重新输入: ");// 除去无效输入的内容scanner.nextLine();}}else {System.out.println("输入错误,请输入数字: ");//除去无效输入的内容scanner.nextLine();}}}}private static void scanDir(File rootFile, String filename) {//列出 rootFile 中的内容File[] files = rootFile.listFiles();if(files == null) {//空目录return;}//遍历 files 数组,判断每个元素的类型for (File file : files) {if(file.isDirectory()) {//是一个目录,递归调用 scanDir 方法.scanDir(file,filename);}else if(file.isFile()) {//是一个文件,判断文件名是否匹配。if(file.getName().contains(filename)) {tryDelete(file);count = false;}}}}private static void tryDelete(File file) {System.out.println("已找到该文件,文件路径为:" + file.getAbsolutePath());System.out.println("是否删除该文件(Y/N)");Scanner scanner = new Scanner(System.in);String choice = scanner.next();if(choice.equals("Y") || choice.equals("y")) {file.delete();System.out.println("删除成功!");}}
}
2、基根据用户输入的源文件路径,复制源文件到指定目录
public static void main(String[] args) {//输入源文件路径和目标目录路径Scanner scanner = new Scanner(System.in);System.out.println("请输入想要复制的文件的路径(要输入文件后缀): ");String srcPath = scanner.next();System.out.println("请输入要复制到的目标目录(如果目标目录和原文件目录相同,文件名字必须不同): ");String destPath = scanner.next();//判断源文件是否存在File srcFile = new File(srcPath);if(!srcFile.isFile()) {System.out.println("该文件不存在!");return;}// 因为destPath最后包含了文件名,而我们所需要的只是前面的目录File destFile = new File(destPath);//得到用户输入的目标目录的父目录File parentFile = destFile.getParentFile();//判断得到的目标目录的父目录计算机中是否存在if(!parentFile.isDirectory()) {System.out.println("目标父目录不存在");return;}//进行拷贝copy(srcFile,destFile);}private static void copy(File srcFile, File destFile) {try(InputStream inputStream = new FileInputStream(srcFile);OutputStream outputStream = new FileOutputStream(destFile)) {while(true) {byte[] arr = new byte[1024];int len = inputStream.read(arr);if(len == -1) {break;}outputStream.write(arr,0,len);}}catch (IOException e){e.printStackTrace();}}
相关文章:
JAVA文件I/O
目录 一、三种路径的分类: 1、绝对路径: 2、相对路径: 3、基准目录: 二、文件的种类: 三、利用JAVA操作文件: 1、File类的构造方法: 2、File 类方法的使用: 使用例子&#…...
第七周作业
一、分别在前端和后端使用联合注入实现“库名-表名-字段名-数据”的注入过程,写清楚注入步骤 1、爆库 后端sql语句:select database(); 前端:1 order by 1#,1 order by 2#,1 order by 3# 判断显示位为两位1 union sel…...
Linux 进程信号详解
进程信号 信号是进程之间事件异步通知的一种方式,属于软中断。 kill -l //查看不同信号代表的事件 执行kill -l 可以看到共有62种信号,其中: 0-31号信号为非可靠信号(这部分信号借鉴于UNIX系统的信号);…...
MCP 应用案例-网络设备批量管理
案例背景 需求痛点 企业需管理数百台跨地域网络设备(交换机/路由器),传统方式存在: 人工SSH登录效率低脚本维护成本高(不同厂商CLI语法差异)状态监控依赖独立监控系统 解决方案 通过MCP协议构建智能网络…...
进程程序替换
fork() 之后,⽗⼦各⾃执⾏⽗进程代码的⼀部分如果⼦进程就想执⾏⼀个全新的程序呢?进程的程序 替换来完成这个功能! 程序替换是通过特定的接⼝,加载磁盘上的⼀个全新的程序(代码和数据),加载到调⽤进程的地址空间中!…...
6.7 ChatGPT自动生成定时任务脚本:Python与Cron双方案实战指南
ChatGPT自动生成定时任务脚本:Python与Cron双方案实战指南 关键词:定时任务调度, ChatGPT 代码生成, Cron 脚本开发, Python 调度器, 自动化更新系统 6.3 使用 ChatGPT 生成 Cron 调度脚本 在 GitHub Sentinel 的定期更新功能中,定时任务调度是核心模块。本节演示如何通过…...
废物九重境弱者学JS第十四天--构造函数以及常用的方法
目录 JavaScript 进阶 - 第2天 深入对象 构造函数 实例成员 静态成员 内置构造函数 Object Array 包装类型 String Number 案例 JavaScript 进阶 - 第2天 了解面向对象编程的基础概念及构造函数的作用,体会 JavaScript 一切皆对象的语言特征,…...
机器学习+深度学习
文章目录 一、机器学习(一)机器学习概念(二)机器学习基本流程(三)机器学习应用场景二、机器学习的常见工具与相关库(一)Python 机器学习库(二)数据处理库(三)可视化库三、聚类算法思想与模型搭建过程(一)K - Means 聚类算法(二)DBSCAN 聚类算法四、分类算法思想…...
docker基本使用命令
一、镜像 1、拉取镜像 docker pull busybox docker pull nginx:1.26-alpine 2、查看本地镜像 [rootRocky-1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 4e1b6bae1e48 18 hours ago 192MB busybox lates…...
相机模型--CMOS和CCD的区别
1--CMOS和CCD的工作原理 CCD(Charge Coupled Device,电荷耦合器件): 1. 图像通过光电效应在感光单元中转化为电荷; 2. 每个像素上的电荷被依次“耦合”并传输到芯片的角落,通过一个或几个模拟输出放大器输…...
触发器(详解)
一:MySQL触发器 MySQL数据库中触发器是一个特殊的存储过程。 不同的是执行存储过程要使用 CALL 语句来调用,而触发器的执行不需要使用 CALL 语句来调用,也不需要手工启动,只要一个预定义的事件发生就会被 MySQL自动调用。 引发…...
Vue 3 中将 ref 创建的响应式对象数据转换为普通(非响应式)的数据
Vue 3 中使用 ref 创建的响应式对象数据转换为普通(非响应式)的数据,有以下几种方法: 1. 访问 .value 属性: 这是最直接、最常见的方法。 由于 ref 对象的值存储在其 .value 属性中,直接访问该属性即可获得普通数据。…...
Vue基础(6)_键盘事件
普通键盘事件 键盘事件常用的有两个:keydown、keyup。 举例: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><script type"text/javascript" src"../js/vue.js"&…...
Kubernetes控制平面组件:高可用 APIServer
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
这个是我的qss按钮样式 和之前的// 应用全局样式表 QString style = R“(是会冲突吗,导致我的按钮背景颜色是黑色,我该怎么修改
/* 样式 A */ *[style-type="A"] { background-color:#cfd1d4; border: none; border-radius: 50%; /* 圆形边框 */ padding: 7px 14px; } *[style-type="A"]:hover { background-color: #45a049; }这个是我的qss按钮样式 和之前的// 应用全局样式表 QStri…...
Kubernetes控制平面组件:API Server详解(二)
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
人工智能在智慧农业中的应用:从田间到餐桌的变革
农业是人类社会的基石,随着全球人口的增长和资源的日益紧张,传统农业面临着巨大的挑战。近年来,人工智能(AI)技术的快速发展为农业带来了新的机遇。智慧农业通过将AI技术与农业生产相结合,实现了从田间种植…...
多人3D游戏完整实现方案
以下是一份完整的代码实现方案,涵盖架构设计、核心模块实现和部署流程。我们以 多人3D游戏 为例,结合之前讨论的Nano服务端框架和Unity客户端: 技术栈 模块技术选型服务端Golang + Nano框架 + MongoDB客户端Unity 2022 + C# + Mirror Networking通信协议Protobuf + WebSock…...
FFUF指南
ffuf 的核心功能: 目录/文件发现: 通过暴力破解(使用字典)探测目标网站的隐藏目录或文件,例如: ffuf -w /path/to/wordlist.txt -u http://target.com/FUZZ 子域名枚举: 通过模糊测试发现目标…...
详细的PyCharm安装教程
详细的PyCharm安装教程 安装前准备 确认系统要求: Windows:Microsoft Windows 10 1809 64位或更高版本,Windows Server 2019 64位或更高版本。 macOS:12.0或更高版本。 Linux:满足以下要求的两个最新版本的Ubuntu LTS或…...
FPGA IO引脚 K7-认知4
UG475来知道bank, GTX, Pin数量, Package, Pinout 时钟 SRCC(Single-Region Clock Capable I/O)和MRCC(Multi-Region Clock Capable I/O)是专用的时钟输入/输出引脚。 如 2.DQS...
C++——异常
1. C语言错误处理机制 我们在曾经介绍过C语言下的错误码。错误码我们过去经常见到,错误码通常是指errno变量中的值,它表示特定操作(如系统调用或库函数)发生错误的原因。errno是一个全局变量,当出现错误时会自动将错误…...
vue3 中 iframe 多页面切换导致资源刷新的问题解决
最近发现一个问题,我在使用 websocket 的时候,在主页面进行了 websocket 连接了之后,再使用 iframe 打开子页面的时候,通常会触发页面刷新,这样就导致 WebSocket 断开,这是因为切换 src 会重新加载 iframe …...
php多种方法实现xss过滤
1. 使用 htmlspecialchars() 函数 htmlspecialchars() 是一个PHP内置函数,用于将特殊字符转换为HTML实体,从而防止浏览器将其解释为HTML或脚本代码。 <?phpfunction sanitizeInput($input) {// 将特殊字符转换为HTML实体return htmlspecialchars($…...
蓝桥杯练习题2
动态规划 动态规划三大题型:计数问题、最值问题、存在性问题; 【最小权值】-- 最值问题 【题目分析】 import java.util.Arrays; Arrays类中的一个方法:Arrays.fill(int[] m,int n) //给 int 类型(或者char类型/Long类型...)的数组全部空间…...
Python遥感开发之Hurst指数的实现
Python遥感开发之Hurst指数的实现 主要讲解Python实现Hurst指数,实现遥感下的Hurst指数,对Hurst指数进行分类,以及结合slope指数实现对未来变化趋势的分析。 文章目录 Python遥感开发之Hurst指数的实现0 什么是Hurst指数1 Python实现Hurst指…...
opencv 给图片和视频添加水印
给图片和视频添加水印 1 给图片添加水印2 给视频添加水印 1 给图片添加水印 代码如下: 添加水印 imgcv2.imread(r../15day4.10/src/xiaoren.png) img2cv2.imread(r../15day4.10/src/bg.png) h,w,cimg.shapeRIO_img2img2[100:100h,200:200w]img3cv2.cvtColor(img,…...
国网B接口协议图像数据上报通知接口流程详解以及上报失败原因(电网B接口)
文章目录 一、B接口协议图像数据上报通知接口介绍B.13.1 接口描述B.13.2 接口流程B.13.3 接口参数B.13.3.1 SIP头字段B.13.3.2 SIP响应码B.13.3.3 XML Schema参数定义 B.13.4 消息示例B.13.4.1 图像数据上报请求B.13.4.2 图像数据上报响应 二、B接口图像数据上报通知失败常见问…...
Redis(持久化)
目录 一 Redis持久化的方式 1. RDB(Redis Database) 2. AOF(Append Only File) 二 对比RDB/AOF 为什么要持久化 Redis是跑在内存上的,但内存上的数据是临时的,Redis服务挂了,数据也就丢失了,所以为了解决上述问题,R…...
Linux系统中的网络管理
1.RHEL9版本中,使用nm进行网络配置,ifcfg不再是网络配置文件的主存储,样式仍然可用,但它不再是NetworkManger存储新网络配置文件的默认位置,RHEL以key-file格式在etc/NetworkManger/system-connections/中存储新的网络…...
【深度学习—李宏毅教程笔记】Transformer
目录 一、序列到序列(Seq2Seq)模型 1、Seq2Seq基本原理 2、Seq2Seq模型的应用 3、Seq2Seq模型还能做什么? 二、Encoder 三、Decoder 1、Decoder 的输入与输出 2、Decoder 的结构 3、Non-autoregressive Decoder 四、Encoder 和 De…...
关于UE5的抗锯齿和TAA
关于闪烁和不稳定现象的详细解释 当您关闭抗锯齿技术时,场景中会出现严重的闪烁和不稳定现象,尤其在有细节纹理和小物体的场景中。这种现象的技术原因如下: 像素采样问题 在3D渲染中,每个像素只能表示一个颜色值,但…...
交换网络基础
学习目标 掌握交换机的基本工作原理 掌握交换机的基本配置 交换机的基本工作原理 交换机是局域网(LAN)中实现数据高效转发的核心设备,工作在 数据链路层(OSI 模型第二层),其基本工作原理可概括为 “学习…...
AUTOSAR图解==>AUTOSAR_SWS_EFXLibrary
AUTOSAR 扩展定点数学函数库(EFX)分析 1. 概述 AUTOSAR (AUTomotive Open System ARchitecture) 是汽车电子控制单元(ECU)软件架构的开放标准。在AUTOSAR架构中,扩展定点数学函数库(Extended Fixed-point library, EFX)提供了一组优化的定点数学运算函数ÿ…...
六边形棋盘格(Hexagonal Grids)的坐标
1. 二位坐标转六边形棋盘的方式 1-1这是“波动式”的 这种就是把【方格子坐标】“左右各错开半个格子”做到的 具体来说有如下几种情况 具体到庙算平台上,是很巧妙的用一个4位整数,前两位为x、后两位为y来进行表示 附上计算距离的代码 def get_hex_di…...
李宏毅NLP-5-RNNTNeural TransducerMoChA
RNN Transducer(RNN-T) 循环神经对齐器(RNA,Recurrent Neural Aligner)对CTC解码器的改进,具体内容如下: “RNA”,全称 “Recurrent Neural Aligner”,引用来自 [Sak, et al., INTERSPEECH’17…...
GPT-SoVITS 使用指南
一、简介 TTS(Text-to-Speech,文本转语音):是一种将文字转换为自然语音的技术,通过算法生成人类可听的语音输出,广泛应用于语音助手、无障碍服务、导航系统等场景。类似的还有SVC(歌声转换&…...
洛谷的几道题
P1000 超级玛丽游戏 # P1000 超级玛丽游戏 ## 题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用。 建议完成本题目后继续尝试 [P1001](/problem/P1001)、[P1008](/problem/P1008)。 另外强烈推荐[新用户必读帖](/discuss/show/241461)。 ## 题目描述 …...
利用yakit充实渗透字典
前言 在渗透侧测试结束,在我们的历史记录中会保存过程中的数据包。在其中有些特征,比如API、参数,可以活用于下次的渗透。 比如 fuzz变量,fuzz隐藏API…… 但是我们一个一个提取很麻烦,可以使用yakit的插件…...
精益数据分析(4/126):开启数据驱动的创业之旅
精益数据分析(4/126):开启数据驱动的创业之旅 在创业的浪潮中,我们都怀揣着梦想,渴望找到那条通往成功的道路。作为一名在创业和数据分析领域摸爬滚打多年的“老兵”,我深知其中的艰辛与挑战。今天&#x…...
机器学习误差图绘
机器学习误差图绘制 绘图类 # Define the ModelComparisonPlot class class ModelComparisonPlot:def __init__(self, model_name):self.model_name model_namedef plot_comparison(self, y_val, y_pred, mse, mae, r2):# Create a figure with two subplotsfig, axes plt.…...
企业级RAG选择难题:数据方案的关键博弈
企业级RAG选择难题:数据方案的关键博弈 向量数据库:高效但易失语境图数据库与知识图谱:关系网络的力量企业级RAG数据方案的最佳实践 智能时代,企业数据每日剧增。员工寻找答案的效率直接影响工作流程,StackOverflow调查…...
JNI 学习
1. JNI 不属于 C,而是 JDK 的 日志失效,可以 adb kill-server adb kill-serveradb start-server 使用 jni final和 private变量都能修改...
PyTorch :优化的张量库
PyTorch 是一个基于 Python 的开源机器学习框架,由 Facebook 的 AI 研究团队(现 Meta AI)于 2016 年推出。它专为深度学习设计,但也可用于传统的机器学习任务。PyTorch 的核心优势在于灵活性、动态计算图和易…...
DevOps 进阶指南:如何让工作流更丝滑?
DevOps 进阶指南:如何让工作流更丝滑? 引言 在 DevOps 世界里,我们追求的是高效、稳定、自动化。但现实总是充满挑战:代码部署失败、CI/CD 过程卡顿、环境不一致……这些痛点让开发和运维团队疲惫不堪。今天,我就来聊聊如何优化 DevOps 工作流,通过实战案例和代码示例,…...
BT-Basic函数之首字母XY
BT-Basic函数之首字母XY 文章目录 BT-Basic函数之首字母XYXxd__ commands Yyes X xd__ commands 当使用外部设备时,开发人员需要在测试计划中添加适当的命令来控制这些设备。下表显示了一个典型的命令序列。 典型的命令序列 NO命令描述1xdload将DLL加载到内存中…...
6. 话题通信 ---- 使用自定义msg,发布方和订阅方cpp,python文件编写
1)在功能包下新建msg目录,在msg目录下新建Person.msg,在Person.msg文件写入: string name uint16 age float64 height 2)修改配置文件 2.1) 功能包下package.xml文件修改 <build_depend>message_generation</build_depend><exec_depend…...
Fastdata极数:全球AR/VR行业发展趋势报告2025
科技的快速发展孕育了一个新的数字前沿领域,那就是虚拟宇宙,也就是我们谈论的元宇宙(Metaverse),虚拟宇宙最初构思于尼尔斯蒂芬森的科幻小说《雪崩》中,小说中虚拟宇宙由虚拟人物居住,并以数字方…...
背包 DP 详解
文章目录 背包DP01 背包完全背包多重背包二进制优化单调队列优化 小结 背包DP 背包 DP,说白了就是往一个背包里扔东西,求最后的最大价值是多少,一般分为了三种:01 背包、完全背包和多重背包。而 01 背包则是一切的基础。 01 背包…...
深入剖析 HashMap:内部结构与性能优化
深入剖析 HashMap:内部结构与性能优化 引言 HashMap 是 Java 集合框架中的核心类,广泛应用于数据存储和检索场景。本文将深入剖析其内部结构,包括数组、链表和红黑树的转换机制,帮助读者理解其工作原理和性能优化策略。 1. Hash…...