【C#基础】C# 文件与IO
序号 | 系列文章 |
---|---|
9 | 【C# 基础】C# 异常处理操作 |
10 | 【C#基础】C# 正则表达式 |
11 | 【C#基础】C# 预处理器指令 |
文章目录
- 前言
- 1,文件和IO的概念
- 2,文本文件操作
- 2.1 File 类
- 2.2 FileInfo 类
- 2.3 FileStream 类
- 2.4 StreamReader 类
- 2.5 StreamWriter 类
- FileStream 和 StreamReader、StreamWriter 的区别:
- 3,二进制文件操作
- 3.1 BinaryReader 类
- 3.2 BinaryWriter 类
- 4,文件目录操作
- 4.1 Directory 类
- 4.2 DirectoryInfo类
- 结语
前言
☀️ 大家好,我是writer桑,前面一章已经学习了 C# 中预处理器指令的使用,那本章就开始学习 C# 程序中的文件与IO,希望看完大家能够有所收获,感谢支持!
1,文件和IO的概念
文件是以计算机硬盘为载体存储在计算机上的信息集合。在 C# 程序中,文件读写存储可以是文本文件和二进制文件。
IO 分别表示 input 和 output, 也就是输入和输出的意思。文件IO操作就是读写文件操作。当对文件进行读写时,程序中会形成一个流,流是对IO设备操作的字节序列封装。输入流和输出流是最常用的两个流操作,分别用于读取文件数据(读操作)和写入文件数据(写操作)。
2,文本文件操作
文本文件操作也就是对文件进行读、写、保存等操作。在 C# 程序中,文本文件的操作有几个类可以做到,其中包括 File、FileInfo、FileStream 和 StreamReader 等类。
2.1 File 类
File 类偏向于执行一些典型的操作,其中包括复制、移动、重命名、创建、打开、删除和追加文本内容。同时,File 类还提供了获取和设置与创建、访问和写入文件相关的文件属性或 DateTime 信息。
下表列出了 File 类中一些常用的方法:
方法名称 | 描述 |
---|---|
AppendAllLines(String, IEnumerable<String>) | 向一个文件中追加行,然后关闭该文件。如果指定文件不存在,此方法会创建一个文件,向其中写入指定的行,然后关闭该文件。 |
AppendAllText(String, String) | 打开一个文件,向其中追加指定的字符串,然后关闭该文件。 如果文件不存在,此方法将创建一个文件,将指定的字符串写入文件,然后关闭该文件。 |
AppendText(String) | 创建一个 StreamWriter,它将 UTF-8 编码文本追加到现有文件或新文件(如果指定文件不存在)。 |
Copy(String, String, Boolean) | 将现有文件复制到新文件。 允许覆盖同名的文件。 |
Create(String) | 在指定路径中创建或覆盖文件。 |
Delete(String) | 删除指定的文件。 |
Exists(String) | 确定指定的文件是否存在。 |
Move(String, String) | 将指定文件移到新位置,提供要指定新文件名的选项。 |
Open(String, FileMode) | 通过不共享的读/写访问权限打开指定路径上的 FileStream。 |
ReadAllText(String) | 打开一个文本文件,读取文件中的所有文本,然后关闭此文件。 |
代码示例:
下面的示例展示了 File 类通过输入 Path 路径参数检查文件是否存在。如果不存在则先创建文件并写入文本内容,然后读取文本内容。如果存在则直接读取文本内容。在运行代码之前,请确保路径中 C 盘内有 test 文件。
using System;
using System.IO; public class Example
{static void FileIO(string path){if (!File.Exists(path)){// 创建文件并写入using (StreamWriter sw = File.CreateText(path)) // using 关键字用于释放资源{sw.WriteLine("Hello");sw.WriteLine("World");sw.WriteLine("Hello, C#");}}// 打开要从中读取的文件。using (StreamReader sr = File.OpenText(path)){string? s;while ((s = sr.ReadLine()) != null){Console.WriteLine(s);}}}static void Main(string[] args){string path = @"c:\test\MyTest.txt";FileIO(path);}
}
点击了解更多 File 类的使用。
2.2 FileInfo 类
FileInfo 类提供用于创建、复制、删除、移动和打开文件的属性和实例方法,并且帮助创建 FileStream 对象。 此类不能被继承。File 类和 FileInfo 类两者的功能基本相同。但是 File 类是静态类,而 FileInfo 类是普通类类型,FileInfo 类需要实例化对象之后才可以调用其中的方法。
下表列出了 File 类中一些常用的方法:
方法名称 | 描述 |
---|---|
AppendText() | 创建一个 StreamWriter,它向 FileInfo 的此实例表示的文件追加文本。 |
CopyTo(String, Boolean) | 将现有文件复制到新文件,允许覆盖现有文件。 |
Create() | 创建文件。 |
CreateText() | 创建写入新文本文件的 StreamWriter。 |
Delete() | 永久删除文件。 |
Equals(Object) | 确定指定对象是否等于当前对象。(继承自 Object) |
GetType() | 获取当前实例的 Type。(继承自 Object) |
Open(FileMode) | 在指定的模式中打开文件。 |
Refresh() | 刷新对象的状态。(继承自 FileSystemInfo) |
Replace(String, String) | 使用当前 FileInfo 对象所描述的文件替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份。 |
代码示例:
FileInfo 类的示例和 File 类的示例差不多,但是 FileInfoIO 示例在 FileIO 示例的基础上增加了对 fi2 文件的删除和复制。
using System;
using System.IO;public class Example
{static void FileInfoIO(string path, string path2){var fi1 = new FileInfo(path);// 创建要写入的文件。 创建新的写入流 using (StreamWriter sw = fi1.CreateText()){sw.WriteLine("Hello");sw.WriteLine("And");sw.WriteLine("Welcome");}// 打开要读取的文件using (StreamReader sr = fi1.OpenText()){var s = "";while ((s = sr.ReadLine()) != null){Console.WriteLine(s);}}try{var fi2 = new FileInfo(path2);//确保目标不存在。fi2.Delete();//复制文件。fi1.CopyTo(path2);Console.WriteLine($"{path} was copied to {path2}.");//删除新建的文件。fi2.Delete();Console.WriteLine($"{path2} was successfully deleted.");}catch (Exception e){Console.WriteLine($"The process failed: {e.ToString()}");}}public static void Main(){string path = Path.GetTempFileName();string path2 = Path.GetTempFileName();FileInfoIO(path, path2);}
}
点击了解更多 FileInfo 类的使用。
2.3 FileStream 类
FileStream 类表示在磁盘或网络路径上指向文件的流。FileStream 使用类读取、写入、打开和关闭文件系统上的文件,操作其他与文件相关的操作系统句柄,包括管道、标准输入和标准输出。FileStream 类既支持同步读写操作,也支持异步读写操作。 File 类和 FileStream 类的关系就像是笔记本和笔的关系,笔记本的内容需要用笔来写。
下表列出了 FileStream 类中一些常用的方法:
方法名称 | 描述 |
---|---|
Close() | 关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。 不直接调用此方法,而应确保流得以正确释放。(继承自 Stream) |
CopyTo(Stream) | 从当前流中读取字节并将其写入到另一流中。 这两个流位置都以复制的字节数为高级。(继承自 Stream) |
Dispose() | 释放由 Stream 使用的所有资源。(继承自 Stream) |
Finalize() | 确保垃圾回收器回收 FileStream 时释放资源并执行其他清理操作。 |
Flush() | 清除此流的缓冲区,使得所有缓冲数据都写入到文件中。 |
Read(Byte[], Int32, Int32) | 从流中读取字节块并将该数据写入给定缓冲区中。 |
Seek(Int64, SeekOrigin) | 将该流的当前位置设置为给定值。 |
Write(Byte[], Int32, Int32) | 将字节块写入文件流。 |
代码示例:
下面的 FileStream 类示例和 File 类的示例逻辑差不多。不同的是程序中的文件流使用 FileStream 来实现,而且文件信息存储方式使用了封装的 AddText 方法实现。
using System;
using System.IO;
using System.Text;public class Example
{private static void AddText(FileStream fs, string value){byte[] info = new UTF8Encoding(true).GetBytes(value);fs.Write(info, 0, info.Length);} static void FileStreamIO(string path){// 如果文件存在,删除该文件。if (File.Exists(path)){File.Delete(path);}// 创建文件。using (FileStream fs = File.Create(path)){AddText(fs, "This is some text");AddText(fs, "This is some more text,");AddText(fs, "\r\nand this is on a new line");AddText(fs, "\r\n\r\nThe following is a subset of characters:\r\n");for (int i = 1; i < 120; i++){AddText(fs, Convert.ToChar(i).ToString());}}// 打开流并读取它。using (FileStream fs = File.OpenRead(path)){byte[] b = new byte[1024];UTF8Encoding temp = new UTF8Encoding(true);int readLen;while ((readLen = fs.Read(b, 0, b.Length)) > 0){Console.WriteLine(temp.GetString(b, 0, readLen));}}}public static void Main(string[] args){string path = @"c:\test\MyTest.txt";FileStreamIO(path); }
}
点击了解更多 FileStream 类的使用。
2.4 StreamReader 类
StreamReader 类也是用于读取文本文件的类, 在 C# 程序中 StreamReader 类继承自 TextReader 类。StreamReader 类以一种特定的编码从字节流中读取字符。
下表列出了 StreamReader 类中一些常用的方法:
方法名称 | 描述 |
---|---|
Close() | 关闭 StreamReader 对象和基础流,并释放与读取器关联的所有系统资源。 |
CreateObjRef(Type) | 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 |
Dispose() | 释放由 TextReader 对象使用的所有资源。 |
Equals(Object) | 确定指定对象是否等于当前对象。 |
Read() | 读取输入流中的下一个字符并使该字符位置提升一个字符。 |
ReadLine() | 从当前流中读取一行字符并将数据作为字符串返回。 |
ReadToEnd() | 读取来自流的当前位置到结尾的所有字符。 |
代码示例:
下面的示例展示了 StreamReader 类的基本用法。 通过输入路径参数 path,StreamReader 类读取指定文件的内容信息并打印输出。如果文件不存在则直接输出无法读取文件的错误。
using System;
using System.IO;public class Example
{public static void StreamReaderIO(string path){try{//创建一个StreamReader实例从文件中读取// using语句同时关闭StreamReader。using (StreamReader sr = new StreamReader(path)){string line;//读取并显示文件中的行,直到//文件到达。while ((line = sr.ReadLine()) != null){Console.WriteLine(line);}}}catch (Exception e){// 让用户知道哪里出错了。Console.WriteLine("The file could not be read:");Console.WriteLine(e.Message);}}public static void Main(){string path = "TestFile.txt";StreamReaderIO(path);}
}
点击了解更多 StreamReader 类的使用。
2.5 StreamWriter 类
StreamWriter 和 StreamReader 类类似。StreamReader 用于文本文件的读取,而 StreamWriter 用于文本文件的数据写入。其中 StreamWriter 类同样继承自 TextWriter 类。StreamWriter 类以一种特定的编码向流中写入字符。
下表列出了 StreamWriter 类中一些常用的方法:
方法名称 | 描述 |
---|---|
Close() | 关闭当前 StreamWriter 对象和基础流。 |
CreateObjRef(Type) | 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 |
Dispose() | 释放由 TextWriter 对象使用的所有资源。 |
Equals(Object) | 确定指定对象是否等于当前对象。 |
Flush() | 清理当前写入器的所有缓冲区,并使所有缓冲数据写入基础流。 |
Write(String) | 将字符串写入流。 |
WriteLine() | 将行终止符写入文本流。 |
代码示例:
下面的示例展示了 StreamWriter 类的基本使用。使用 GetDirectories 方法获取 C 盘所有目录名称,再使用 StreamWriter 方法写入 CDriveDirs 文本文件。 再确保 sr 对象不为 null 的情况下打印输出 C 盘上所有目录名称。
using System;
using System.IO;public class Example
{static void StreamWriterIO(string path){// 获取当前C驱动器上的目录。DirectoryInfo[] cDirs = new DirectoryInfo(@"c:\").GetDirectories();// 将每个目录名写入一个文件。using (StreamWriter sw = new StreamWriter("CDriveDirs.txt")){foreach (DirectoryInfo dir in cDirs){sw.WriteLine(dir.Name);}}// 读取并显示文件中的每一行。string line = "";using (StreamReader sr = new StreamReader(path)){while ((line = sr.ReadLine()) != null){Console.WriteLine(line);}}}static void Main(string[] args){string path = "CDriveDirs.txt";StreamWriterIO(path);}
}
点击了解更多 StreamWriter 类的使用。
FileStream 和 StreamReader、StreamWriter 的区别:
- FileStream 类在执行对文件的读写操作中,也包含了 StreamReader 和 StreamWriter 类的操作。
- FileStream 类操作的是字节和字节数组,而 StreamReader 和 StreamWriter 类操作的是字符数据。
- FileStream 适合对较大的文件进行操作, 而 StreamReader 和 StreamWriter 类适合对较小文件进行操作。
3,二进制文件操作
二进制文件和文本文件在广义上没有区别,但是在狭义上二进制文件与文本文件的区别在于以下几点:
- 存储的数据类型不同。文本文件只能存储 char 类型字符变量,二进制文件可以存储 char、int 和 short 等很多类型的变量。
- 读取的方式不同。文本文件只能被文本编辑器读取,比如记事本、记事板等,而二进制文件需要特殊的编码器,例如 png 等格式的图片文件需要用照片软件打开,mp4 等格式的视频需要用播放器打开。
- 系统对文件的处理方式不同。例如 windows 系统对文本文件中的 ‘\n’ 换行符会进行隐式转换为 “\r\n”,而 Linux 系统则不会进行这样的操作。
在 C# 程序中,可以使用 BinaryReader 和 BinaryWriter 类对二进制文件进行读写操作。
3.1 BinaryReader 类
在 C# 中,BinaryReader 类用于从流中读取二进制信息。和 File 类一样,BinaryReader 类也位于 System.IO 命名空间中,而且 BinaryReader 类还支持以特定编码方式读取字符串。
下表列出了 BinaryReader 类中一些常用的方法:
方法名称 | 描述 |
---|---|
Close() | 关闭当前阅读器及基础流。 |
Dispose() | 释放 BinaryReader 类的当前实例所使用的所有资源。 |
Read() | 从基础流中读取字符,并根据所使用的 Encoding 和从流中读取的特定字符,提升流的当前位置。 |
ReadBoolean() | 从当前流中读取 Boolean 值,并使该流的当前位置提升 1 个字节。 |
ReadByte() | 从当前流中读取下一个字节,并使流的当前位置提升 1 个字节。 |
ReadChar() | 从当前流中读取下一个字符,并根据所使用的 Encoding 和从流中读取的特定字符,提升流的当前位置。 |
ReadDecimal() | 从当前流中读取十进制数值,并将该流的当前位置提升十六个字节。 |
方法示例:
下面的代码示例展示了 BinaryReader 类的基本使用。 在确保文件 AppSettings.dat 存在的情况下, 使用 BinaryReader 构造函数进行读取输出。实现了一个在文件中存储和检索应用程序设置的功能。
using System;
using System.IO;
using System.Text;public class Example
{const string fileName = "AppSettings.dat"; // 文件名 // 写入默认的值 public static void WriteDefaultValues(){// using (var stream = File.Open(fileName, FileMode.Create)){using (var writer = new BinaryWriter(stream, Encoding.UTF8, false)){writer.Write(1.250F);writer.Write(@"c:\Temp");writer.Write(10);writer.Write(true);}}}// 打印输出值 public static void DisplayValues(){float aspectRatio;string tempDirectory;int autoSaveTime;bool showStatusBar;if (File.Exists(fileName)){using (var stream = File.Open(fileName, FileMode.Open)){using (var reader = new BinaryReader(stream, Encoding.UTF8, false)){aspectRatio = reader.ReadSingle();tempDirectory = reader.ReadString();autoSaveTime = reader.ReadInt32();showStatusBar = reader.ReadBoolean();}}Console.WriteLine("Aspect ratio set to: " + aspectRatio);Console.WriteLine("Temp directory is: " + tempDirectory);Console.WriteLine("Auto save time set to: " + autoSaveTime);Console.WriteLine("Show status bar: " + showStatusBar);}}static void Main(){WriteDefaultValues();DisplayValues();}
}
点击了解更多 BinaryReader 类的使用。
3.2 BinaryWriter 类
在 C# 程序中,BinaryWriter 和 BinaryReader 类分别用于从流中读取和写入二进制信息。BinaryWriter 和 BinaryReader 类类似。用于从流中写入二进制信息,而且支持用特定的编码写入字符串。
下表列出了 BinaryReader 类中一些常用的方法:
方法名称 | 描述 |
---|---|
Close() | 关闭当前的 BinaryWriter 和基础流。 |
Dispose() | 释放 BinaryWriter 类的当前实例所使用的所有资源。 |
Seek(Int32, SeekOrigin) | 设置当前流中的位置。 |
Write(Boolean) | 将单字节 Boolean 值写入当前流,其中 0 表示 false,1 表示 true。 |
Write(Byte) | 将一个无符号字节写入当前流,并将流的位置提升 1 个字节。 |
Write(Char) | 将 Unicode 字符写入当前流,并根据所使用的 Encoding 和向流中写入的特定字符,提升流的当前位置。 |
Write(Decimal) | 将一个十进制值写入当前流,并将流位置提升十六个字节。 |
代码示例:
在 BinaryReader 类的示例中已经用到了 BinaryWriter 类的功能。在程序当中创建打开了 AppSettings.dat 文件,并实例化了 BinaryWriter 类对象使用 Write 方法进行信息的写入。
// 写入默认的值
public static void WriteDefaultValues()
{using (var stream = File.Open(fileName, FileMode.Create)){using (var writer = new BinaryWriter(stream, Encoding.UTF8, false)){writer.Write(1.250F);writer.Write(@"c:\Temp");writer.Write(10);writer.Write(true);}}
}
点击了解更多 BinaryWriter 类的使用。
4,文件目录操作
在 C# 中,允许使用 Directory、DirectoryInfo 等类进行对文件目录进行创建、枚举、移动等操作。
4.1 Directory 类
Directory 类 是一个公开用于通过目录和子目录进行创建、移动和枚举的静态方法。Directory 类位于 System.IO 命名空间,且 Directory 类不能被继承。
下表列出了 Directory 类中一些常用的方法:
方法名称 | 描述 |
---|---|
CreateDirectory(String) | 在指定路径中创建所有目录和子目录,除非它们已经存在。 |
Delete(String) | 从指定路径删除空目录。 |
EnumerateDirectories(String) | 返回指定路径中的目录完整名称的可枚举集合。 |
Exists(String) | 确定给定路径是否引用磁盘上的现有目录。 |
GetCreationTime(String) | 获取目录的创建日期和时间。 |
GetFiles(String) | 返回指定目录中文件的名称(包括其路径)。 |
GetFileSystemEntries(String) | 返回指定路径中的所有文件和子目录的名称。 |
Move(String, String) | 将文件或目录及其内容移到新位置。 |
ResolveLinkTarget(String, Boolean) | 获取指定目录链接的目标。 |
SetCreationTime(String, DateTime) | 为指定的文件或目录设置创建日期和时间。 |
代码示例:
以下的示例展示了 Directoy 类如何从目录中检索所有文本文件并将其移动到新目录。移动文件后,它们不再存在于原始目录中。在运行之前请确保 C 盘内有 current 和 archive 文件。
using System;
using System.IO;public class Example
{static void DirectoryIO(string sourceDirectory, string archiveDirectory){try{var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt");foreach (string currentFile in txtFiles){string fileName = currentFile.Substring(sourceDirectory.Length + 1);Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName));Console.WriteLine("current文件中的txt文本文件移动到了archive文件中");}}catch (Exception e){Console.WriteLine(e.Message);}}static void Main(string[] args){string sourceDirectory = @"C:\current";string archiveDirectory = @"C:\archive";DirectoryIO(sourceDirectory, archiveDirectory);}
}
点击了解更多 Directory 类的使用。
4.2 DirectoryInfo类
DirectoryInfo 类和 Directory 类两者的功能基本相同,只不过 DirectoryInfo 类是一个实例方法,而Directory 类是一个静态方法。DirectoryInfo 类位于 System.IO 命名空间,且 DirectoryInfo 类不能被继承。
下表列出了 DirectoryInfo 类中一些常用的方法:
方法名称 | 描述 |
---|---|
Create() | 创建目录。 |
CreateObjRef(Type) | 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 |
Delete() | 如果此 DirectoryInfo 为空则将其删除。 |
EnumerateDirectories() | 返回当前目录中的目录信息的可枚举集合。 |
GetDirectories() | 返回当前目录的子目录。 |
GetFiles() | 返回当前目录的文件列表。 |
MoveTo(String) | 将 DirectoryInfo 实例及其内容移动到新路径。 |
Refresh() | 刷新对象的状态。 |
代码示例:
using System;
using System.IO;public class Example
{static void DirectoryInfoIO(string path){// 指定要操作的目录。DirectoryInfo di = new DirectoryInfo(path);try{// 确定目录是否存在。if (di.Exists){//表示目录已经存在。Console.WriteLine("这条路径已经存在了。");return;}// 尝试创建目录。di.Create();Console.WriteLine("创建目录成功。");// 删除目录。di.Delete();Console.WriteLine("删除目录成功。");}catch (Exception e){Console.WriteLine("进程失败: {0}", e.ToString());}}public static void Main(){string path = @"c:\MyDir";DirectoryInfoIO(path);}
}
点击了解更多 DirectoryInfo 类的使用。
结语
☁️ 以上就是 C# 文件与IO的介绍啦,希望能够对大家有所帮助。望大家多多支持,你们的支持就是笔者创作最大的动力!
相关文章:
【C#基础】C# 文件与IO
序号系列文章9【C# 基础】C# 异常处理操作10【C#基础】C# 正则表达式11【C#基础】C# 预处理器指令文章目录前言1,文件和IO的概念2,文本文件操作2.1 File 类2.2 FileInfo 类2.3 FileStream 类2.4 StreamReader 类2.5 StreamWriter 类FileStream 和 Stream…...

死锁相关介绍【内含哲学家就餐问题】
死锁 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 场景1:一个线程,一把锁 一个线程,一把锁,线程…...

Java的Groovy执行器内存泄露(MetaSpace)问题分析与解决办法
环境与背景 在java程序中通过GroovyScriptEvaluator执行器创建脚本Script对象调用Groovy脚本语言来完成某些功能, ,会通过AppClassLoader或者GroovyClassLoader去生产一个随机的名称的Groovy的Script类对象,导致元数据,产生的class类会被AppClassLoader或者GroovyClassLoader内…...

【linux】进程信号——信号的产生
进程信号一、信号概念1.1 信号理解二、产生信号2.1 通过键盘产生信号2.2 捕捉信号自定义signal2.3 系统调用接口产生信号2.3.1 向任意进程发送任意信号kill2.3.2 给自己发送任意信号raise2.3.3 给自己发送指定信号abort2.3.4 理解2.4 硬件异常产生信号2.4.1 除0异常2.4.2 野指针…...
部署OpenStack
部署 1. 环境配置 配置主机名 使用CRT软件连接controller节点和compute节点,用户名默认为root,密码默认为000000。连接上之后,使用linux命令修改节点主机名。 [rootcontroller ~]# hostnamectl set-hostname controller [rootcontroller …...

Java 运算符与类型转化
Java 运算符与类型转化 1 算术运算符 Java中的算术运算符主要有(加)、-(减)、*(乘)、/(除)、%(求余),它们都是二元运算符。 2 自增和自减运算…...
《C++ Primer Plus》第18章:探讨 C++ 新标准(2)
移动语义和右值引用 现在介绍本书前面未讨论的主题。C11 支持移动语义,这就提出了一些问题:为何需要移动语义?什么是移动语义?C11 如何支持它?下面首先讨论第一个问题。 为何需要移动语义 先来看 C11 之前的复制过程…...

QML定时器
QML使用Timer使用定时器 Timer 计时器可用于触发操作一次,或以给定的间隔重复触发。 常用属性: interval 设置触发器之间的间隔(以毫秒为单位)。 默认间隔为 1000 毫秒。 repeat 设置重复,为真,则以指定的…...

第三章 opengl之纹理
OpenGL纹理纹理环绕方式纹理过滤多级渐远纹理加载和创建纹理stb_image.h生成纹理纹理的应用纹理单元纹理 用stb_image.h库,原先用SOIL库也可以实现。 可以为每个顶点添加颜色来增加图形的细节。但是想得到一个真实的图形,需要足够多的顶点,…...
【Flink】FlinkSQL中执行计划以及如何用代码看执行计划
FilnkSQL怎么查询优化 Apache Flink 使用并扩展了 Apache Calcite 来执行复杂的查询优化。 这包括一系列基于规则和成本的优化,例如: • 基于 Apache Calcite 的子查询解相关 • 投影剪裁 • 分区剪裁 • 过滤器下推 • 子计划消除重复数据以避免重复计算 • 特殊子查询重写,…...

从业者必读,一篇文章轻松掌握DevOps核心概念和最佳技能实践!
文章目录前言一. DevOps的定义及由来二. DevOps的价值三. devops工具有哪些3.1 devops工程师的硬实力3.2 devops工程师的软实力总结前言 大家好,又见面了,我是沐风晓月,本文是对DevOps的总结,一篇文章告诉你什么是DevOps. 对很多…...

2023爱分析·一体化HR SaaS市场厂商评估报告:北森
目录 1.研究范围定义 2. 一体化HR SaaS市场分析 3.厂商评估:北森 4.入选证书 1.研究范围定义 研究范围 伴随数字化转型走向深入,企业人力资源数字化也进入快速发展阶段,人力资源的价值也得到了重新审视和定义。政策层面,《…...
JAVA练习67-二叉树的中序遍历
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、题目-二叉树的中序遍历 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示:这里可以添加本文要记录的大概内容: 3月3日练习…...

【JeecgBoot-Vue3】第1节 源码下载和环境安装与启动
目录 一. 资料 1. 源码下载 2. 官网启动文档 二、 前端开发环境安装 2.1 开发工具 2.2 前后端代码下载 2.3 前端启动 Step 1:安装nodejs npm Step 2:配置国内镜像(这里选阿里) Step 3:安装yarn Step 4&…...

WebAPI
WebAPI知识详解day11.Web API 基本认知作用和分类什么是DOM?DOM树的概念DOM对象2.获取DOM对象通过css选择器获取dom对象通过其他方法获取dom3.设置/修改DOM元素内容方法1. document.write() 方法方法2. 对象.innerText 属性方法3. 对象.innerHTML4.设置/修改DOM元素…...
Shell命令——date的用法
date命令可以用来显示或设定系统的日期与时间。 一、显示系统的日期与时间 (1)如果date命令后面不加任何参数,则会按照固定的格式显示时间信息: 星期几 月份 日 时:分:秒 时区 年xjhubuntu:~/iot/tmp$ date Fri Mar 3 16:56:4…...

XSS跨站脚本
XSS跨站脚本XSS简介XSS验证XSS危害XSS简介 XSS被称为跨站脚本攻击(Cross-site scripting),由于和CSS(Cascading Style Sheets)重名,所以改为XSS。XSS主要基于javascript语言完成恶意的攻击行为,因为javascript可以非常灵活的操作html、css和…...

【强烈建议收藏:MySQL面试必问系列之慢SQL优化专题】
一.知识回顾 学习本篇文章之前呢,我们可以先看一下【强烈建议收藏:MySQL面试必问系列之SQL语句执行专题】,看完这篇文章再来学习本篇文章可谓是如虎添翼。好的,那我们也不讲太多的废话,直接开始。 二.如何做慢SQL查询优化呢&…...
windows,liunx,java实现apk解压,去签名、重新签名,重新打包apk
背景:由于项目需要,需要将apk包加入服务端返回的静态资源文件到apk中,形成离线apk包供下载安装。经过调查研究,决定使用apktool实现。关于apktool的资料可以参考 https://blog.csdn.net/quantum7/article/details/124060620 htt…...

【Linux】进程信号
🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉信号入门&…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...