javaEE -6(10000详解文件操作)
一:认识文件
我们先来认识狭义上的文件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。
文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,我们把这部分信息可以视为文件的元信息。
同时,随着文件越来越多,我们就需要对文件进行管理,如何进行文件的组织呢,一种合乎自然的想法出现了,就是按照层级结构进行组织 —— 也就是我们数据结构中学习过的树形结构。这样,一种专门用来存放管理信息的特殊文件诞生了,也就是我们平时所谓文件夹(folder)或者目录(directory)的概念。
1.1 文件路径
如何在文件系统中如何定位我们的一个唯一的文件就成为当前要解决的问题,这其实很简单,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描述,而这种描述方式就被称为文件的绝对路径(absolute path)。
除了可以从根开始进行路径的描述,我们可以从任意结点出发,进行路径的描述,而这种描述方式就被称为相对路径(relative path),相对于当前所在结点的一条路径。
文件的相对路径是以当前所在目录(工作目录)为基准的,每个程序运行的时候都有一个工作目录,IDEA的工作目录默认为当前项目所在的目录
1.2 文件的分类
文件根据其保存数据的不同,被分为不同的类型,我们一般简单的划分为文本文件和二进制文件,分别指代保存被字符集编码的文本和按照标准格式保存的非被字符集编码过的文件。
Windows 操作系统上,会按照文件名中的后缀来确定文件类型以及该类型文件的默认打开程序。但这个习俗并不是通用的,在 OSX、Unix、Linux 等操作系统上,就没有这样的习惯,一般不对文件类型做如此精确地分类。
1.3 文件管理
文件由于被操作系统进行了管理,所以根据不同的用户,会赋予用户不同的对待该文件的权限,一般地可以认为有可读、可写、可执行权限。
Windows 操作系统上,还有一类文件比较特殊,就是平时我们看到的快捷方式(shortcut),这种文件只是对真实文件的一种引用而已。其他操作系统上也有类似的概念,例如,软链接(soft link)等。
最后,很多操作系统为了实现接口的统一性,将所有的 I/O 设备都抽象成了文件的概念,使用这一理念最为知名的就是 Unix、Linux 操作系统 —— 万物皆文件。
二: Java 中操作文件
Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不代表真实存在该文件。
下面我们来看看 File 类中的常见属性、构造方法和方法:
- 属性
修饰符及类型 | 属性 | 说明 |
---|---|---|
static | String | pathSeparator |
static | char | pathSeparator |
- 构造方法
方法签名 | 说明 |
---|---|
File(File parent, String child) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例 |
File(String pathname) | 根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径 |
File(String parent, String child) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示 |
下面是一个示例 Java 程序来演示如何使用这三个构造方法:
import java.io.File;public class FileConstructorExample {public static void main(String[] args) {// 使用父目录 + 孩子文件路径创建一个新的 File 实例File file1 = new File("C:/myfolder", "myfile.txt");// 使用文件路径创建一个新的 File 实例File file2 = new File("C:/myfolder/myfile.txt");// 使用父目录 + 孩子文件路径创建一个新的 File 实例,父目录用路径表示File parentDir = new File("C:/myfolder");File file3 = new File(parentDir, "myfile.txt");// 打印文件路径System.out.println("file1 路径:" + file1.getPath());System.out.println("file2 路径:" + file2.getPath());System.out.println("file3 路径:" + file3.getPath());}
}
方法:
修饰符及返回值类型 | 方法签名 | 说明 |
---|---|---|
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() | 判断用户是否对文件有可写权限 |
以下是这些方法的使用示例代码:
import java.io.File;
import java.io.IOException;public class FileDemo {public static void main(String[] args) {// 创建File对象File file = new File("path/to/file.txt");// 并不要求该文件真实存在// getParent()String parent = file.getParent(); // 返回父目录路径System.out.println("父目录路径:" + parent); // 输出:父目录路径:path/to// getName()String name = file.getName(); // 返回文件名System.out.println("文件名:" + name); // 输出:文件名:file.txt// getPath()String path = file.getPath(); // 返回文件路径System.out.println("文件路径:" + path); // 输出:文件路径:path/to/file.txt// getAbsolutePath()String absolutePath = file.getAbsolutePath(); // 返回绝对路径System.out.println("绝对路径:" + absolutePath); // 输出:绝对路径:path/to/file.txt// getCanonicalPath()try {String canonicalPath = file.getCanonicalPath(); // 返回修饰过的绝对路径System.out.println("修饰过的绝对路径:" + canonicalPath); // 输出:修饰过的绝对路径:path/to/file.txt} catch (IOException e) {e.printStackTrace();}// exists()boolean exists = file.exists(); // 判断文件是否存在System.out.println("文件是否存在:" + exists); // 输出:文件是否存在:false// isDirectory()boolean isDirectory = file.isDirectory(); // 判断是否为目录System.out.println("是否为目录:" + isDirectory); // 输出:是否为目录:false// isFile()boolean isFile = file.isFile(); // 判断是否为文件System.out.println("是否为文件:" + isFile); // 输出:是否为文件:false// createNewFile()try {boolean created = file.createNewFile(); // 创建空文件System.out.println("文件创建是否成功:" + created); // 输出:文件创建是否成功:true} catch (IOException e) {e.printStackTrace();}// delete()boolean deleted = file.delete(); // 删除文件System.out.println("文件是否删除成功:" + deleted); // 输出:文件是否删除成功:true// deleteOnExit()file.deleteOnExit(); // 标注文件在JVM运行结束时删除// list()File directory = new File("path/to/directory");String[] fileList = directory.list(); // 获取目录下的所有文件名System.out.println("目录下的文件名:");for (String fileName : fileList) {System.out.println(fileName);}// listFiles()File[] files = directory.listFiles(); // 获取目录下的所有文件对象System.out.println("目录下的文件路径:");for (File fileObject : files) {System.out.println(fileObject.getPath());}// mkdir()boolean directoryCreated = directory.mkdir(); // 创建目录System.out.println("目录创建是否成功:" + directoryCreated); // 输出:目录创建是否成功:true// mkdirs()boolean directoriesCreated = directory.mkdirs(); // 创建目录,包括中间目录,mkdir() 的时候,如果中间目录不存在,则无法创建成功; mkdirs() 可以解决这个问题。System.out.println("目录创建是否成功:" + directoriesCreated); // 输出:目录创建是否成功:true// renameTo()File newFile = new File("path/to/newFile.txt");boolean renamed = file.renameTo(newFile); // 文件重命名(移动文件)System.out.println("文件重命名是否成功:" + renamed); // 输出:文件重命名是否成功:true// canRead()boolean canRead = file.canRead(); // 判断文件是否可读System.out.println("文件是否可读:" + canRead); // 输出:文件是否可读:true// canWrite()boolean canWrite = file.canWrite(); // 判断文件是否可写System.out.println("文件是否可写:" + canWrite); // 输出:文件是否可写:true}
}
三:文件内容的读写——数据流
3.1 InputStream
- 方法:
修饰符及返回值类型 | 方法签名 | 说明 |
---|---|---|
int | read() | 读取一个字节的数据,返回 -1 代表已经完全读完了 |
int | read(byte[] b) | 最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表已经读完了 |
int | read(byte[] b, int off, int len) | 最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表已经读完了 |
void | close() | 关闭字节流 |
InputStream 只是一个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输入设备都可以对应一个 InputStream 类,我们现在只关心从文件中读取,所以使用 FileInputStream
FileInputStream的构造方法:
签名 | 说明 |
---|---|
FileInputStream(File file) | 利用 File 构造文件输入流 |
FileInputStream(String name | 利用文件路径构造文件输入流 |
对于流的分类我们有两种分法:
- 按流的方向分类:输入流、输出流
- 按数据处理单位:字节流、字符流
现在我们理解一下什么是输入,什么是输出:
3.2 字节流
3.2.1字节输入流InputStream
-
read()方法:
- 读取一个字节的数据,并返回读取的字节值。如果已经达到文件的末尾,则返回-1。
-
read(byte[] b)方法:
- 将数据读取到给定的字节数组b中,并返回读取的字节数。如果已经达到文件的末尾,则返回-1。
-
read(byte[] b, int off, int len)方法:
- 将最多len个字节的数据读取到给定的字节数组b的off位置开始的地方,并返回读取的字节数。如果已经达到文件的末尾,则返回-1。
-
close()方法:
- 关闭输入流,并释放与之关联的系统资源。
假设存在一个名为"example.txt"的文本文件,并且文件内容为 hello world!下面是这四个方法的使用示例:
import java.io.FileReader;
import java.io.IOException;public class FileReaderExample {public static void main(String[] args) {try (FileReader reader = new FileReader("example.txt")) {int data;// 使用 read() 方法读取一个字节的数据,并返回读取的字节值// 如果已经达到文件的末尾,则返回-1data = reader.read();System.out.println((char) data); // 输出:h// 使用 read(byte[] b) 方法将数据读取到给定的字节数组b中// 并返回读取的字节数,如果已经达到文件的末尾,则返回-1byte[] buffer = new byte[5];int bytesRead = reader.read(buffer);String text = new String(buffer, 0, bytesRead);System.out.println(text); // 输出:ello// 使用 read(byte[] b, int off, int len) 方法将最多 len 个字节的数据读取到给定的字节数组b的off位置开始的地方// 并返回读取的字节数,如果已经达到文件的末尾,则返回-1bytesRead = reader.read(buffer, 0, 5);text = new String(buffer, 0, bytesRead);System.out.println(text); // 输出: worl// 关闭输入流,并释放与之关联的系统资源reader.close();} catch (IOException e) {e.printStackTrace();}}
}
3.2.2 字节输出流OutputStream`
-
write(byte[] b)
:将给定的字节数组写入输出流。 -
write(byte[] b, int off, int len)
:将指定的字节数组的一部分写入输出流。off
参数表示起始偏移量,len
参数表示要写入的字节数。 -
write(int b)
:将指定的字节写入输出流。参数b
是一个int
类型的整数,但只会写入低8位的字节。 -
close()
:关闭输出流。关闭后,将无法继续写入数据。
以下是一个示例的Java程序,展示了如何使用FileOutputStream
和FileInputStream
类对文件执行写入和读取操作。程序中演示了write(byte[] b)
、write(byte[] b, int off, int len)
、write(int b)
和close()
方法的使用。假设存在一个名为"example.txt"的文本文件,并且文件内容为"hello world!"。
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;public class FileWriterExample {public static void main(String[] args) {String fileName = "example.txt";try {// 使用 FileOutputStream 进行文件写入FileOutputStream fos = new FileOutputStream(fileName);// 使用 write(byte[] b) 方法替换整个文件内容byte[] replaceBytes = "new content".getBytes();fos.write(replaceBytes);// 使用 write(byte[] b, int off, int len) 方法替换文件一部分内容byte[] partialBytes = " content".getBytes();fos.write(partialBytes, 4, partialBytes.length - 4);// 使用 write(int b) 方法写入单个字节int singleByte = '!'; // 写入 ASCII 值为 33 的字符fos.write(singleByte);// 关闭输出流fos.close();// 使用 FileInputStream 进行文件读取FileInputStream fis = new FileInputStream(fileName);// 读取文件内容并打印int content;while ((content = fis.read()) != -1) {System.out.print((char) content);}// 关闭输入流fis.close();} catch (IOException e) {System.out.println("发生错误:" + e.getMessage());}}
}
3.3 字符流
3.3.1 字符输入流Reader
-
read()
:从输入流中读取一个字符,并返回读取的字符的ASCII值。如果已经到达流的末尾,则返回-1。 -
read(char[] cbuf)
:从输入流中读取字符,并将它们存储在字符数组cbuf
中。返回读取的字符数。 -
read(char[] cbuf, int off, int len)
:从输入流中读取字符,并将它们存储在字符数组cbuf
的指定位置off
开始的位置,并最多读取len
个字符。返回读取的字符数。 -
read(CharBuffer target)
:从输入流中读取字符,并将它们存储在CharBuffer
中。返回读取的字符数。 -
flush()
:刷新输出流并将任何缓冲的输出字符写入到底层流中。 -
close()
:关闭输入流,释放与其关联的资源。
代码和字节输入流中的代码效果类似,只不过读取是通过字符而已
3.3.2 字符输出流Writer
当使用字符输出流 Writer
进行操作时,可以使用以下方法:
-
write(char[] cbuf)
:将字符数组cbuf
中的字符写入输出流。 -
write(char[] cbuf, int off, int len)
:将字符数组cbuf
中从索引off
开始的len
个字符写入输出流。 -
write(int c)
:将给定的字符编码c
写入输出流。 -
write(String str)
:将字符串str
写入输出流。 -
write(String str, int off, int len)
:将字符串str
中从索引off
开始的len
个字符写入输出流。 -
flush()
:刷新输出流,将缓冲区中的内容立即写入到目标设备中。 -
close()
:关闭输出流,并释放相关的系统资源。
代码和字节输出流中的代码效果类似,只不过输出是通过字符而已
案例:进行普通的文件复制
import java.io.*;
import java.util.*;
public class Main {public static void main(String[] args) throws IOException {Scanner scanner = new Scanner(System.in);System.out.print("请输入要复制的文件(绝对路径 OR 相对路径): ");String sourcePath = scanner.next();File sourceFile = new File(sourcePath);if (!sourceFile.exists()) {System.out.println("文件不存在,请确认路径是否正确");return;}if (!sourceFile.isFile()) {System.out.println("文件不是普通文件,请确认路径是否正确");return;}System.out.print("请输入要复制到的目标路径(绝对路径 OR 相对路径): ");String destPath = scanner.next();File destFile = new File(destPath);if (destFile.exists()) {if (destFile.isDirectory()) {System.out.println("目标路径已经存在,并且是一个目录,请确认路径是否正
确");return;}if (destFile.isFile()) {System.out.println("目录路径已经存在,是否要进行覆盖?y/n");String ans = scanner.next();if (!ans.toLowerCase().equals("y")) {System.out.println("停止复制");return;}}}try (InputStream is = new FileInputStream(sourceFile)) {try (OutputStream os = new FileOutputStream(destFile)) {byte[] buf = new byte[1024];int len;while (true) {len = is.read(buf);if (len == -1) {break;}os.write(buf, 0, len);}os.flush();}}System.out.println("复制已完成");}
}
3.3.3 读写代码参考
- 如何按字节进行数据读
try (InputStream is = ...) {byte[] buf = new byte[1024];while (true) {int n = is.read(buf);if (n == -1) {break;}// buf 的 [0, n) 表示读到的数据,按业务进行处理}
}
- 如何按字节进行数据写
try (OutputStream os = ...) {byte[] buf = new byte[1024];while (/* 还有未完成的业务数据 */) {// 将业务数据填入 buf 中,长度为 nint n = ...;os.write(buf, 0, n);}os.flush(); // 进行数据刷新操作
}
- 如何按字符进行数据读
try (InputStream is = ...) {try (Scanner scanner = new Scanner(is, "UTF-8")) {while (scanner.hasNextLine()) {String line = scanner.nextLine();// 根据 line 做业务处理}}
}
- 如何按字符进行数据写
try (OutputStream os = ...) {try (OutputStreamWriter osWriter = new OutputStreamWriter(os, "UTF-8")) {try (PrintWriter writer = new PrintWriter(osWriter)) {while (/* 还有未完成的业务数据 */) {writer.println(...);}writer.flush(); // 进行数据刷新操作}}
}
相关文章:

javaEE -6(10000详解文件操作)
一:认识文件 我们先来认识狭义上的文件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,…...

图像处理之《基于多MSB预测和Huffman编码的加密图像可逆数据隐藏》论文精读
一、文章摘要 随着云存储和隐私保护的发展,可逆数据隐藏在加密图像中(RDHEI)作为一种技术越来越受到人们的关注,它可以:在图像加密领域嵌入额外的数据,确保嵌入的数据可以无差错地提取,原始图像可以无损地恢复。本文提…...

Nginx安装配置项目部署然后加SSL
个人操作笔记记录 第一步:把 nginx 的源码包nginx-1.8.0.tar.gz上传到 linux 系统 第二步:解压缩 tar zxvf nginx-1.8.0.tar.gz 第三步:进入nginx-1.8.0目录 使用 configure 命令创建一 makeFile 文件。 直接复制过去运行 ./configur…...

【算法练习Day26】分发饼干摆动序列 最大子数组和
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 分发饼干摆动序列最大子数组…...
redis缓存击穿/穿透/雪崩面试回答
面试官:什么是缓存穿透 ? 怎么解决 ? 候选人: 嗯~~,我想一下 缓存穿透是指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致…...

Jmeter性能测试 —— TPS拐点寻找
寻找TPS性能拐点1、准备脚本①在本地电脑调试Jmeter压测脚本 ②上传到压测机Jmeter所在的服务器 2、执行压力测试①执行压测脚本 jmeter –n –t xianchengzuse.jmx ②记录业务压测数据 3、监控服务器性能指标 ①监控CPU输入top命令 ②监控内存 free –m ③jstat监控sweep和…...

科技资讯|苹果穿戴新专利,表带、服装等织物可变身柔性屏幕或扬声器
根据美国商标和专利局(USPTO)本周公示的清单,苹果公司获得了一项新的技术专利,可以在 Apple Watch 表带、服装等物品上,引入基于织物的柔性扬声器。 根据专利描述,通过在织物中嵌入声学组件(例…...

数据分析和机器学习的11个高级可视化图表介绍
可视化是一种强大的工具,用于以直观和可理解的方式传达复杂的数据模式和关系。它们在数据分析中发挥着至关重要的作用,提供了通常难以从原始数据或传统数字表示中辨别出来的见解。 可视化对于理解复杂的数据模式和关系至关重要,我们将介绍11…...

祝所有的程序猿们2023年的1024节快乐~
许久没更新Bolg了,眼看就要到1024节,其实也是没有可以更新的东西,目前在PhD,发现很多东西都还需要慢慢沉淀,放一doctoral college 开学的时候ppt的老图。 越往深处研究会陷入泥潭,考虑的细节将会越来越多&…...

Win10/Win11系统bitlocker正在等待激活如何解决?
有同学升级Win10系统后,发现C盘与D盘分区盘符中出现了黄色的锁定感叹号,还显示“bitlocker正在等待激活”,这可能是用户开启了bitlocker加密所导致的。下面就来看看解决的办法吧。 一、bitlocker正在等待激活的解决方法 打开控制面板-系统和安…...

酷开科技 | 酷开系统,为居家生活打开更精彩的窗口
电视在我们的日常生活中扮演着重要的角色。虽然,作为客厅C位的扛把子——电视的娱乐作用深入人心,但是,它的涵义和影响力却因我们每个人的具体生活环境而存在着种种差异,而我们的生活环境又受到我们所处的社会及文化环境的影响。 …...

谷歌真的不喜欢 Node.js ?
有人在 Quora 上提问,为什么谷歌不喜欢 Node.js 呢,Google 的 UX 工程师和来自 Node.js 团队的开发者分别回答了他们对这个问题的看法,对于编程语言来说,每一门语言都有它自己的优势,重要的是如何用它去解决问题。 谷…...
前端项目如何找到所有未被引用的文件
要找到 React 项目中所有未被引用的文件,可以使用工具来进行静态代码分析。以下是一些方法: 使用静态代码分析工具unimported: 静态代码分析工具可以找到未被引用的 JSX 文件。一个常用的工具是 “unimported”。以下是使用它的步骤ÿ…...

CANoe-使用IG Ethernet Packet Builder实现IP包分片的若干问题
在文章《CANoe-Ethernet IG和Ethernet Packet Builder的使用和区别》中,我们讲过Packet Builder可以组装多种类型的以太网报文: 当我们想组装一条icmpv4 echo request报文,payload只有1个字节的数据FF时,选择ICMPv4 Packet,创建一条ICMPv4报文,把payload改为1个字节: 然…...

UE4逆向篇-2_各类数据的查找方式
写在前面 1.通过前面的文章,相信各位已经能够自己找到GNames并使用DUMP工具导出GNames了。 2.本篇文章将介绍各种所需数据的查找方法。 一、准备工作 1.CheatEngine,本篇以及后续篇幅的重要工具。 2.一个记事本,保证你能记录下关键信息。…...
JDBC-day07(Apache-DBUtils实现CRUD操作)
九:Apache-DBUtils实现CRUD操作 1 Apache-DBUtils简介 Apache-DbUtils 是 Apache 组织提供的开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用DbUtils能极大简化JDBC编码的工作量,同时也不会影响程序的…...

零代码编程:用ChatGPT多线程批量将PDF文档转换为word格式
pdf2docx是Python的一个库,可以很方便的将PDF文档转换为word格式,首先安装这个库。 然后在ChatGPT中输入提示词: 你是一个Python编程专家,要完成一个文档格式转换的任务,具体步骤如下: 打开F盘的Books文件…...

codeshell安装配置
codeshell安装配置 1 注意事项1.1 Python版本问题 2 codeshell环境搭建2.1 codeshell使用软件各版本2.2 软件下载2.3 codeshell使用环境安装2.3.1 python-3.10.9-amd64.exe安装2.3.2 Anaconda3-2022.10-Windows-x86_64.exe安装2.3.3 创建环境2.3.4 Pytorch安装2.3.5 transforme…...

mfc140u.dll丢失的详细解决方法,最详细修复mfc140u.dll丢失的办法分享
在计算机技术日益发展的今天,我们不可避免地会遇到各种各样的技术问题。其中,“MFC140U.DLL丢失”是一个常见的错误,它可能会影响我们的电脑性能和软件运行。本文将详细介绍四种解决“MFC140U.DLL丢失”问题的方法。 首先,我们需…...
CMake
文章目录 前言一、快速开始编译C/C代码1. 只有源码的项目2. 包含库的项目3. 编译成库给他人使用使用cmake的流程1. 生成构建系统2. 执行构建3. 执行测试4. 安装 && 打包 二、cmake 语法简介1 变量2 条件语句3 脚本命令**消息打印****if-else**:**list命令**:…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...