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

【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】文件操作

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 文件1.1 认识文件1.2 分清操作的是内存还是硬盘1.3 路径1.3.1 目录结构1.3.2 相对和绝对路径 1.4 文本文件…...

代码随想录算法训练营第74天:路径总结[1]

代码随想录算法训练营第74天&#xff1a;路径总结 ‍ A * 算法精讲 &#xff08;A star算法&#xff09; 卡码网&#xff1a;126. 骑士的攻击(opens new window) 题目描述 在象棋中&#xff0c;马和象的移动规则分别是“马走日”和“象走田”。现给定骑士的起始坐标和目标…...

用 Emacs 写代码有哪些值得推荐的插件

以下是一些用于 Emacs 写代码的值得推荐的插件&#xff1a; Ido-mode&#xff1a;交互式操作模式&#xff0c;它用列出当前目录所有文件的列表来取代常规的打开文件提示符&#xff0c;能让操作更可视化&#xff0c;快速遍历文件。Smex&#xff1a;可替代普通的 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个开发人员&#xff0c;项目经理接到了M个独立的需求&#xff0c;每个需求的工作量不同&#xff0c;且每个需求只能由一个开发人员独立完成&#xff0c;不能多人合作。 假定各个需求之间无任何先后依赖关系&#xff0c;请…...

如何使用Pip从Git仓库安装Python包:深入探索远程依赖管理

如何使用Pip从Git仓库安装Python包&#xff1a;深入探索远程依赖管理 Python的包管理工具Pip使得安装和管理Python库变得非常简单。有时&#xff0c;我们需要安装那些尚未发布到PyPI的包&#xff0c;或者想要尝试最新的开发版本。这时&#xff0c;可以直接从Git仓库安装包。本…...

计算机专业怎么选择电脑

现在高考录取结果基本已经全部出来了&#xff0c;很多同学都如愿以偿的进入到了计算机类专业&#xff0c;现在大部分同学都在为自己的大学生活做准备了&#xff0c;其中第一件事就是买电脑&#xff0c;那计算机类专业该怎么选择电脑呢&#xff1f; 计算机专业是个一类学科&…...

当前国内可用的docker加速器搜集 —— 筑梦之路

可用镜像加速器 以下地址搜集自网络&#xff0c;仅供参考&#xff0c;请自行验证。 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校招/青云计划/社招——长期有效

及时跟进进度&#xff0c;保证不让简历石沉大海&#xff01; 涵盖NLP/CV/CG/ML/多模态/数据科学/多媒体等各方向! 定向匹配优质团队/竞争力薪酬/覆盖全球工作地点! 招聘对象: 本硕博:2024年1月-2025年12月毕业的同学 目前最热岗位: 技术研究-自然语言处理 技术研究-计算机视觉 …...

集群限流sentinel实践

参考&#xff1a; 集群模式 实践 集群流控规则 其中 用一个专门的 ClusterFlowConfig 代表集群限流相关配置项&#xff0c;以与现有规则配置项分开&#xff1a; // 全局唯一的规则 ID&#xff0c;由集群限流管控端分配. private Long flowId;// 阈值模式&#xff0c;默认&…...

Flutter-实现双向PK进度条

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

unix高级编程系列之文件I/O

背景 作为linux 开发者&#xff0c;我们不可避免会接触到文件编程。比如通过文件记录程序配置参数&#xff0c;通过字符设备与外设进行通信。因此作为合格的linux开发者&#xff0c;一定要熟练掌握文件编程。在文件编程中&#xff0c;我们一般会有两类接口函数&#xff1a;标准…...

PySide(PyQt),记录最后一次访问文件的路径

1、在同目录下用文本编辑器创建JSON文件&#xff0c;命名为setting.json&#xff0c;并输入以下内容后保存&#xff1a; { "setting": { "last_file": [ "" ] } } 2、应用脚本&#xff1a; import json …...

wordpress企业网站模板免费下载

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

[leetcode hot 150]第一百一十七题,填充每个节点的下一个右侧节点

题目&#xff1a; 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL 。 初始状态下&#x…...

Docker 入门篇(十 一)-- 网络配置总结

Docker 容器技术的核心优势之一是其轻量级的虚拟化和隔离性&#xff0c;而 Docker 网络则是实现容器间以及容器与外界通信的关键。以下是对 Docker 网络的关键知识点的总结。 一、 Docker 网络概述 Docker 网络允许容器进行相互通信以及与外部网络的连接。Docker 提供了多种网…...

【Android面试八股文】Android 有哪些存储数据的方式?

在Android平台上,有多种方式可以存储数据,每种方式都适合不同类型的数据和使用场景。以下是主要的存储数据方式: SharedPreferences(轻量级数据存储): SharedPreferences是用于存储简单键值对数据的最简单方法,适合存储用户偏好设置、配置信息等。数据以XML文件形式存储…...

3. train_encoder_decoder.py

train_encoder_decoder.py #__future__ 模块提供了一种方式&#xff0c;允许开发者在当前版本的 Python 中使用即将在将来版本中成为标准的功能和语法特性。此处为了确保代码同时兼容Python 2和Python 3版本中的print函数 from __future__ import print_function # 导入标准库…...

Hyper-V克隆虚拟机教程分享!

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

QDockWidget类详解

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

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...