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

【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# 程序中,可以使用 BinaryReaderBinaryWriter 类对二进制文件进行读写操作。

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&#xff0c;文件和IO的概念2&#xff0c;文本文件操作2.1 File 类2.2 FileInfo 类2.3 FileStream 类2.4 StreamReader 类2.5 StreamWriter 类FileStream 和 Stream…...

死锁相关介绍【内含哲学家就餐问题】

死锁 死锁是这样一种情形&#xff1a;多个线程同时被阻塞&#xff0c;它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。 场景1&#xff1a;一个线程&#xff0c;一把锁 一个线程&#xff0c;一把锁&#xff0c;线程…...

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节点&#xff0c;用户名默认为root&#xff0c;密码默认为000000。连接上之后&#xff0c;使用linux命令修改节点主机名。 [rootcontroller ~]# hostnamectl set-hostname controller [rootcontroller …...

Java 运算符与类型转化

Java 运算符与类型转化 1 算术运算符 Java中的算术运算符主要有&#xff08;加&#xff09;、-&#xff08;减&#xff09;、*&#xff08;乘&#xff09;、/&#xff08;除&#xff09;、%&#xff08;求余&#xff09;&#xff0c;它们都是二元运算符。 2 自增和自减运算…...

《C++ Primer Plus》第18章:探讨 C++ 新标准(2)

移动语义和右值引用 现在介绍本书前面未讨论的主题。C11 支持移动语义&#xff0c;这就提出了一些问题&#xff1a;为何需要移动语义&#xff1f;什么是移动语义&#xff1f;C11 如何支持它&#xff1f;下面首先讨论第一个问题。 为何需要移动语义 先来看 C11 之前的复制过程…...

QML定时器

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

第三章 opengl之纹理

OpenGL纹理纹理环绕方式纹理过滤多级渐远纹理加载和创建纹理stb_image.h生成纹理纹理的应用纹理单元纹理 用stb_image.h库&#xff0c;原先用SOIL库也可以实现。 可以为每个顶点添加颜色来增加图形的细节。但是想得到一个真实的图形&#xff0c;需要足够多的顶点&#xff0c;…...

【Flink】FlinkSQL中执行计划以及如何用代码看执行计划

FilnkSQL怎么查询优化 Apache Flink 使用并扩展了 Apache Calcite 来执行复杂的查询优化。 这包括一系列基于规则和成本的优化,例如: • 基于 Apache Calcite 的子查询解相关 • 投影剪裁 • 分区剪裁 • 过滤器下推 • 子计划消除重复数据以避免重复计算 • 特殊子查询重写,…...

从业者必读,一篇文章轻松掌握DevOps核心概念和最佳技能实践!

文章目录前言一. DevOps的定义及由来二. DevOps的价值三. devops工具有哪些3.1 devops工程师的硬实力3.2 devops工程师的软实力总结前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文是对DevOps的总结&#xff0c;一篇文章告诉你什么是DevOps. 对很多…...

2023爱分析·一体化HR SaaS市场厂商评估报告:北森

目录 1.研究范围定义 2. 一体化HR SaaS市场分析 3.厂商评估&#xff1a;北森 4.入选证书 1.研究范围定义 研究范围 伴随数字化转型走向深入&#xff0c;企业人力资源数字化也进入快速发展阶段&#xff0c;人力资源的价值也得到了重新审视和定义。政策层面&#xff0c;《…...

JAVA练习67-二叉树的中序遍历

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、题目-二叉树的中序遍历 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 3月3日练习…...

【JeecgBoot-Vue3】第1节 源码下载和环境安装与启动

目录 一. 资料 1. 源码下载 2. 官网启动文档 二、 前端开发环境安装 2.1 开发工具 2.2 前后端代码下载 2.3 前端启动 Step 1&#xff1a;安装nodejs npm Step 2&#xff1a;配置国内镜像&#xff08;这里选阿里&#xff09; Step 3&#xff1a;安装yarn Step 4&…...

WebAPI

WebAPI知识详解day11.Web API 基本认知作用和分类什么是DOM&#xff1f;DOM树的概念DOM对象2.获取DOM对象通过css选择器获取dom对象通过其他方法获取dom3.设置/修改DOM元素内容方法1. document.write() 方法方法2. 对象.innerText 属性方法3. 对象.innerHTML4.设置/修改DOM元素…...

Shell命令——date的用法

date命令可以用来显示或设定系统的日期与时间。 一、显示系统的日期与时间 &#xff08;1&#xff09;如果date命令后面不加任何参数&#xff0c;则会按照固定的格式显示时间信息&#xff1a; 星期几 月份 日 时:分:秒 时区 年xjhubuntu:~/iot/tmp$ date Fri Mar 3 16:56:4…...

XSS跨站脚本

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

【强烈建议收藏:MySQL面试必问系列之慢SQL优化专题】

一.知识回顾 学习本篇文章之前呢&#xff0c;我们可以先看一下【强烈建议收藏:MySQL面试必问系列之SQL语句执行专题】&#xff0c;看完这篇文章再来学习本篇文章可谓是如虎添翼。好的&#xff0c;那我们也不讲太多的废话&#xff0c;直接开始。 二.如何做慢SQL查询优化呢&…...

windows,liunx,java实现apk解压,去签名、重新签名,重新打包apk

背景&#xff1a;由于项目需要&#xff0c;需要将apk包加入服务端返回的静态资源文件到apk中&#xff0c;形成离线apk包供下载安装。经过调查研究&#xff0c;决定使用apktool实现。关于apktool的资料可以参考 https://blog.csdn.net/quantum7/article/details/124060620 htt…...

【Linux】进程信号

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;信号入门&…...

SpringBoot 集成Junit单元测试

学习文章: https://www.cnblogs.com/ysocean/p/6889906.html 开发工具: IDEA 2022.1.4 目录 目录 1. 概述 2. 实现步骤 2.1 maven导入依赖 2.2 随意代码演示(不推荐) 2.3 规范代码演示(推荐) 3. Junit相关其他注解 4. 注意事项 5. 结语 1. 概述 接触到Junit&#xff0c;…...

Android开发之简单控件

文章目录一 文本显示1.1 文本设置的两种方式1.2 常见字号单位类型2.2 设置文本的颜色三 视图基础3.1 设置视图的宽高3.2 设置视图的间距3.3 设置视图的对齐方式四常用布局4.1 线性布局LinearLayout4.2 相对布局RelativeLayout4.3 网格布局GridLayout4.4 滚动视图ScrollView五 按…...

树状数组讲解

树状数组 文章目录树状数组引入例题AcWing241.楼兰图腾思路代码AcWing 242. 一个简单的整数问题思路代码AcWing 244. 谜一样的牛思路代码总结引入 树状数组主要维护的是这样一个数据结构&#xff1a; tr[x]表示以x为终点的长度为lowbit(x)的前缀和、最大值、最小值、最大公约数…...

每个Android开发都应需知的性能指标~

无论你是发布一个新的 Android 应用&#xff0c;还是希望提高现有应用的性能&#xff0c;你都可以使用 Android 应用性能指标来帮助你。 在这篇文章中&#xff0c;我将解释什么是 Android 应用性能指标&#xff0c;并列出8个需要考虑跟踪的维度和建议的基线。 什么是 Android…...

MSYS2安装

最近在学习windows上编译FFmpeg&#xff0c;需要用到msys2&#xff0c;在此记录一下安装和配置过程。 点击如下链接&#xff0c;下载安装包&#xff1a; Index of /msys2/distrib/x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 我下载的是&#xff1a;ms…...

3/3考试总结

时间安排 7:30–7:50 看题&#xff0c;怎么感觉三道构造&#xff0c;T3 貌似有网络流背景。 7:50–8:30 T1,有一些简单的性质&#xff0c;缩减两端点后枚举一下翻转的区间就可以了。然后花了一点时间写 spj 调试。 8:30–10:20 T2,比较纯粹的构造题。有网络流做法&#xff0c;…...

Spark Streaming DStream转换

DStream上的操作与RDD的类似&#xff0c;分为Transformations&#xff08;转换&#xff09;和Output Operations&#xff08;输出&#xff09;两种&#xff0c;此外转换操作中还有一些比较特殊的算子&#xff0c;如&#xff1a;updateStateByKey()、transform()以及各种Window相…...

水果商城,可运行

文章目录项目介绍一、技术栈二、本项目分为前后台&#xff0c;有管理员与用户两种角色&#xff1b;1、管理员角色包含以下功能&#xff1a;2、用户角色包含以下功能&#xff1a;三、用户功能页面展示四、管理员功能页面展示五、部分代码展示六、获取整套项目源码项目介绍 一、…...

LiveGBS国标GB/T28181国标视频流媒体平台-功能报警订阅配置报警预案告警截图及录像

LiveGBS国标GB/T28181国标视频流媒体平台-功能报警订阅配置报警预案告警截图及录像1、报警信息1.1、报警查询1.2、配置开启报警订阅1.2.1、国标设备编辑1.2.2、选择开启报警订阅1.3、配置摄像头报警1.3.1、配置摄像头报警通道ID1.3.2、配置摄像头开启侦测1.3.3、尝试触发摄像头…...

软件测试---测试分类

一 : 按测试对象划分 1.1 可靠性测试 可靠性&#xff08;Availability&#xff09;即可用性&#xff0c;是指系统正常运行的能力或者程度&#xff0c;一般用正常向用户提供软件服务的时间占总时间的百分比表示。 1.2 容错性测试 行李箱 , 四个轮子 , 坏了一个 , 说明这个容错…...

用什么软件做动漫视频网站/宁波网络营销推广公司

一、for语句 (1)、语句结构 for 定义变量 do 使用变量执行动作 done 结束标志(2)、示例 格式1 seq&#xff08;启始值&#xff0c;间隔值&#xff0c;最终值&#xff09; for WESTOS in $(seq 1 2 10) do echo $WESTOS done格…...

网站建设谈业务要知道什么/如何制作百度网页

1.什么是贪心算法 贪心算法是在当前情况下做出的最优决定&#xff0c;它只考虑眼前&#xff0c;获得的是局部的最优解&#xff0c;并且&#xff0c;希望通过每次获得局部最优解最后找到全局的最优解。 2.贪心算法的特点 a.贪心算法并不保证得到最优解&#xff0c;但是&#xff…...

前端做网站都要做哪些/seo排名优化联系13火星软件

Description有一个a*b的整数组成的矩阵&#xff0c;现请你从中找出一个n*n的正方形区域&#xff0c;使得该区域所有数中的最大值和最小值的差最小。Input第一行为3个整数&#xff0c;分别表示a,b,n的值第二行至第a1行每行为b个非负整数&#xff0c;表示矩阵中相应位置上的数。每…...

wordpress做门户网/南昌seo专业团队

java jcp昨天&#xff0c;亚马逊宣布他们已加入Java Community Process 。 AWS开发人员工具中的Artifacts and Languages组经理Yishai Galatzer在一篇博客文章中写道&#xff1a;“亚马逊运行着数千种Java生产服务&#xff1b; 我们和我们的客户都严重依赖JDK&#xff08;Java开…...

一个数据库怎么做二个网站/百度收录技术

今天终于考完了70-528,长长舒口气 呵呵&#xff0c;可以安安心心的回国度假了。这次考试真是一波三折啊。下面先说说考试过程 一个月前开始准备考MCTS,但是当时只是似懂非懂这个东西&#xff0c;一直都觉得可有可无&#xff0c;所以当时也没有太放在心上。天天70-536的Training…...

奉化网站建设/西安seo顾问公司

现在大多数描述SQL Server 2005新特性的文章都关注于华而不实的特性&#xff0c;如SQL CLR或XML数据类型&#xff0c;而对许多老很好的老的T-SQL语言的改进没有得到应有的关注。我曾经从许多DBA口中听到令他们更兴奋的是看到T-SQL语言的改进,而不是那些新出现和发布的功能。对于…...