JavaEE-文件操作和IO

我们先来认识狭义上的⽂件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进⾏数据保存时,往往不是保存成⼀个整体,⽽是独⽴成⼀个个的单位进⾏保存,这个独⽴的单位就被抽象成⽂件的概念,就类似办公桌上的⼀份份真实的⽂件⼀般.

⽂件除了有数据内容之外,还有⼀部分信息,例如⽂件名、⽂件类型、⽂件⼤⼩等并不作为⽂件的数据⽽存在,我们把这部分信息可以视为⽂件的元信息.

树型结构组织 和 ⽬录

同时,随着⽂件越来越多,对⽂件的系统管理也被提上了⽇程,如何进⾏⽂件的组织呢,⼀种合乎⾃然的想法出现了,就是按照层级结构进⾏组织⸺也就是我们数据结构中学习过的树形结构。这样,⼀种专⻔⽤来存放管理信息的特殊⽂件诞⽣了,也就是我们平时所谓⽂件夹(folder)或者⽬录(directory)的概念。

例如:我们点开一个文件,里面又有很多个文件,就和树的子类一样

文件路径(Path)

如何在⽂件系统中如何定位我们的⼀个唯⼀的⽂件就成为当前要解决的问题,但这难不倒计算机科学家,因为从树型结构的⻆度来看,树中的每个结点都可以被⼀条从根开始,⼀直到达的结点的路径所描述,⽽这种描述⽅式就被称为⽂件的绝对路径(absolute path)。

除了可以从根开始进⾏路径的描述,我们可以从任意结点出发,进⾏路径的描述,⽽这种描述⽅式就被称为相对路径(relative path),相对于当前所在结点的⼀条路径。

其他知识

即使是普通⽂件,根据其保存数据的不同,也经常被分为不同的类型,我们⼀般简单的划分为⽂本⽂件和⼆进制⽂件,分别指代保存被字符集编码的⽂本和按照标准格式保存的⾮被字符集编码过的⽂件。

Windows操作系统上,会按照⽂件名中的后缀来确定⽂件类型以及该类型⽂件的默认打开程序。但这个习俗并不是通⽤的,在OSX、Unix、Linux等操作系统上,就没有这样的习惯,⼀般不对⽂件类型做如此精确地分类。

⽂件由于被操作系统进⾏了管理,所以根据不同的⽤⼾,会赋予⽤⼾不同的对待该⽂件的权限,⼀般地可以认为有可读、可写、可执⾏权限。

Windows操作系统上,还有⼀类⽂件⽐较特殊,就是平时我们看到的快捷⽅式(shortcut),这种⽂件只是对真实⽂件的⼀种引⽤⽽已。其他操作系统上也有类似的概念,例如,软链接(soft link)等。

最后,很多操作系统为了实现接⼝的统⼀性,将所有的I/O设备都抽象成了⽂件的概念,使⽤这⼀理念最为知名的就是Unix、Linux\操作系统⸺万物皆⽂件。

Java操作文件(正文)

Java中通过 java.io.File 类来对⼀个⽂件(包括⽬录)进⾏抽象的描述。注意,有File?对象,
并不代表真实存在该⽂件。

File 概述

我们先来看看 File 类中的常⻅属性、构造⽅法和⽅法

属性

修饰符及类型              属性                    说明
static String           pathSeparator          依赖于系统的路径分隔符,String类型的表⽰
static char              pathSeparator           依赖于系统的路径分隔符,char类型的表⽰

构造方法

签名                                                说明
File(File parent,String child)          根据⽗⽬录+孩⼦⽂件路径,创建⼀个新的File实例
File(String pathname)                    根据⽂件路径创建⼀个新的File实例,路径可以是绝对路径或者相对路径
File(String parent,String child)       根据⽗⽬录+孩⼦⽂件路径,创建⼀个新的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()                        判断⽤⼾是否对⽂件有可写权限

File的方法代码示例:

1.(示例)观察get系列的特点和差异

import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("..\\hello-world.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());
}
}

运行结果:

..
hello-world.txt
..\hello-world.txt
D:\代码练习\⽂件⽰例1\..\hello-world.txt
D:\代码练习\hello-world.txt

2.(示例)普通文件的创建和删除

import java.io.File;
import java.io.IOException;
public class Main {
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.isFile());
System.out.println(file.createNewFile());
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.createNewFile());
}
}

运行结果:

false
false
false
true
true
false
true
false

3.(示例)普通文件的删除

import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("some-file.txt"); // 要求该⽂件不存在,才能看到相
System.out.println(file.exists());
System.out.println(file.createNewFile());
System.out.println(file.exists());
System.out.println(file.delete());
System.out.println(file.exists());
}
}

运行结果:

false
true
true
true
false

4.(示例)观察deleteOnExit的现象

import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("some-file.txt"); // 要求该⽂件不存在,才能看到相
System.out.println(file.exists());System.out.println(file.createNewFile());
System.out.println(file.exists());
file.deleteOnExit();
System.out.println(file.exists());
}
}

运行结果:

false
true
true
true

程序运⾏结束后,⽂件还是被删除了

5.(示例)观察目录的创建

import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File dir = new File("some-dir"); // 要求该⽬录不存在,才能看到相同的现
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
System.out.println(dir.mkdir());
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
}
}

运行结果:

false
false
true
true
false

6.(示例)观察目录创建2

import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File dir = new File("some-parent\\some-dir"); // some-parent 和 so
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
System.out.println(dir.mkdir());
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
}
}

运行结果:

false
false
false
false
false

mkdir()的时候,如果中间⽬录不存在,则⽆法创建成功;mkdirs()可以解决这个问题。

import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File dir = new File("some-parent\\some-dir"); // some-parent 和 so
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
System.out.println(dir.mkdirs());
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
}
}

运行结果:

false
false
true
true
false

7.(示例)观察文件重命名

import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("some-file.txt"); // 要求 some-file.txt 得存在
File dest = new File("dest.txt"); // 要求 dest.txt 不存在
System.out.println(file.exists());
System.out.println(dest.exists());
System.out.println(file.renameTo(dest));
System.out.println(file.exists());
System.out.println(dest.exists());
}
}

运行结果:

true
false
true
false
true

文件内容的读写--数据流

InputStream概述

方法:

说明
InputStream只是⼀个抽象类,要使⽤还需要具体的实现类。关于InputStream的实现类有很多,基本可以认为不同的输⼊设备都可以对应⼀个InputStream类,我们现在只关⼼从⽂件中读取,所以使⽤FileInputStream

FileInputStream概述

代码示例:

(1)

将⽂件完全读完的两种⽅式。相⽐较⽽⾔,后⼀种的IO次数更少,性能更好。

import java.io.*;
// 需要先在项⽬⽬录下准备好⼀个 hello.txt 的⽂件,⾥⾯填充 "Hello" 的内容
public class Main {
public static void main(String[] args) throws IOException {
try (InputStream is = new FileInputStream("hello.txt")) {
while (true) {
int b = is.read();
if (b == -1) {
// 代表⽂件已经全部读完
break;
}
System.out.printf("%c", b);
}
}
}
}
import java.io.*;
// 需要先在项⽬⽬录下准备好⼀个 hello.txt 的⽂件,⾥⾯填充 "Hello" 的内容
public class Main {
public static void main(String[] args) throws IOException {
try (InputStream is = new FileInputStream("hello.txt")) {
byte[] buf = new byte[1024];
int len;
while (true) {len = is.read(buf);
if (len == -1) {
// 代表⽂件已经全部读完
break;
}
for (int i = 0; i < len; i++) {
System.out.printf("%c", buf[i]);
}
}
}
}
}

(2)

这⾥我们把⽂件内容中填充中⽂看看,注意,写中⽂的时候使⽤UTF-8编码。text.txt中填写"你好
中国"
注意:这⾥我利⽤了这⼏个中⽂的UTF-8编码后⻓度刚好是3个字节和⻓度不超过1024字节的现状,但这种⽅式并不是通⽤的

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;public class Demo94 {public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./text.txt")){byte[] buffer = new byte[1024];int len =0;while(true ){len = inputStream.read(buffer);if(len==-1){break;}for (int i = 0; i <len ; i+=3) {String s = new String(buffer,i,3);System.out.println(s );}}}}
}

利⽤Scanner进⾏字符读取

上述例⼦中,我们看到了对字符类型直接使⽤InputStream进⾏读取是⾮常⿇烦且困难的,所以,我们使⽤⼀种我们之前⽐较熟悉的类来完成该⼯作,就是Scanner类

构造⽅法                                                              说明
Scanner(InputStream is,String charset)  使⽤charset字符集进⾏is的扫描读取

示例:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;public class Demo83 {public static void main(String[] args) throws FileNotFoundException {try(InputStream inputStream = new FileInputStream("./text.txt")){Scanner scanner = new Scanner(inputStream);while(scanner.hasNext()){String s = scanner.next();System.out.print(s);}} catch (IOException e) {throw new RuntimeException(e);}}
}

OutputStream概述

方法

说明:

OutputStream同样只是⼀个抽象类,要使⽤还需要具体的实现类。我们现在还是只关⼼写⼊⽂件
中,所以使⽤FileOutputStream

⽤OutputStreamWriter进⾏字符写⼊

示例:

(1)

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class Demo76 {public static void main(String[] args) throws FileNotFoundException {try (OutputStream outputStream = new FileOutputStream("./text.txt")){outputStream.write('1');outputStream.write('s');outputStream.flush();} catch (IOException e) {throw new RuntimeException(e);}}
}

(2)

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class Demo86 {public static void main(String[] args) {try(OutputStream outputStream = new FileOutputStream("./text.txt",true)){byte[] buffer = new byte[]{'a','v','s','y'};outputStream.write(buffer);outputStream.flush();} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}

(3)

import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
try (OutputStream os = new FileOutputStream("output.txt")) {
byte[] b = new byte[] {
(byte)'G', (byte)'o', (byte)'o', (byte)'d', (byte)'B', (byte)'a'
};
os.write(b, 0, 4);
// 不要忘记 flush
os.flush();
}
}
}

(4)

import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
try (OutputStream os = new FileOutputStream("output.txt")) {
String s = "你好中国";
byte[] b = s.getBytes("utf-8");
os.write(b);
// 不要忘记 flush
os.flush();
}

利⽤PrintWriter找到我们熟悉的⽅法
上述,我们其实已经完成输出⼯作,但总是有所不⽅便,我们接来下将OutputStream处理下,使⽤PrintWriter类来完成输出,因为PrintWriter类中提供了我们熟悉的print/println/printf⽅法

import java.io.*;public class Demo856 {public static void main(String[] args) throws FileNotFoundException {try(OutputStream outputStream = new FileOutputStream("./text.txt")){PrintStream printStream = new PrintStream(outputStream);printStream.printf("我是第一行");printStream.println("我是第二行");printStream.println("我是第三行");outputStream.flush();} catch (IOException e) {throw new RuntimeException(e);}}
}

小程序练习

⽰例1

扫描指定⽬录,并找到名称中包含指定字符的所有普通⽂件(不包含⽬录),并且后续询问⽤⼾是否要删除该⽂件

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Demo867 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入要搜索的目录根节点");String rootDirPath = scanner.next();File rootDir = new File(rootDirPath);if(rootDir.isDirectory()){System.out.println("不是目录,退出");return;}System.out.println("请输入要搜索文件包含的名字");String token = scanner.next();List<File> result = new ArrayList<>();scanDir(rootDir,token,result);System.out.println("共找到了->");for (File file:result) {System.out.println("请问您是否需要删除该文件");String str = scanner.next();if(str.toLowerCase().equals("yes")){file.delete();}}}private static void scanDir(File rootDir, String token, List<File> result) {File[] files = rootDir.listFiles();if(files==null || files.length==0){return;}for (int i = 0; i < files.length; i++) {if(files[i].isDirectory()){scanDir(files[i],token,result);}else if(files[i].getName().contains(token)){result.add(files[i]);}}}
}

⽰例2
进⾏普通⽂件的复制

import java.io.*;
import java.util.Scanner;public class Demo462 {public static void main(String[] args) throws FileNotFoundException {Scanner scanner =new Scanner(System.in);System.out.println("请输入要复制的文件的目录");String rootDirPath = scanner.next();File rootDir = new File(rootDirPath);if(!rootDir.exists()){return;}if(!rootDir.isFile()){return;}System.out.println("请输入要复制到的路径");String destDirPath = scanner.next();File destDir = new File(destDirPath);if(!destDir.exists()){return;}if(destDir.isDirectory()){return;}try(InputStream inputStream = new FileInputStream(rootDir);OutputStream outputStream = new FileOutputStream(destDir)){
byte[] buffer = new byte[1024];
int b = 0;
while(true){b = inputStream.read(buffer );if(b==-1){break;}outputStream.write(buffer);
}
outputStream.flush();} catch (IOException e) {throw new RuntimeException(e);}}
}

⽰例3
扫描指定⽬录,并找到名称或者内容中包含指定字符的所有普通⽂件(不包含⽬录)
注意:我们现在的⽅案性能较差,所以尽量不要在太复杂的⽬录下或者⼤⽂件下实验

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Demo853 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入要搜索的目录根节点");String rootDirPath = scanner.next();File rootDir = new File(rootDirPath);if(rootDir.isDirectory()){System.out.println("不是目录,退出");return;}System.out.println("请输入要搜索文件包含的名字");String token = scanner.next();List<File> result = new ArrayList<>();scanDir(rootDir,token,result);System.out.println("共找到了->");for (File file:result) {System.out.println("请问您是否需要删除该文件");String str = scanner.next();if(str.toLowerCase().equals("yes")){file.delete();}}}private static void scanDir(File rootDir, String token, List<File> result) {File[] files = rootDir.listFiles();if(files==null || files.length==0){return;}for (int i = 0; i < files.length; i++) {if(files[i].isDirectory()){scanDir(files[i],token,result);}else if(true){
StringBuffer stringBuffer = new StringBuffer(files[i].getName());
if(stringBuffer.indexOf(token) != -1){result.add(files[i]);
}}else if(isContain(files[i],token)){result.add(files[i].getAbsoluteFile());}}}private static boolean isContain(File file, String token) {StringBuffer stringBuffer = new StringBuffer();try(InputStream inputStream = new FileInputStream(file)){Scanner scanner = new Scanner(inputStream);while(scanner.hasNext()){String str = scanner.nextLine();stringBuffer.append(str);}} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}return stringBuffer.indexOf(token) != -1;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/284378.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java程序设计 4、5章 练习题

一、填空题 1.假设有 String s1 "Welcome to Java"; String s2 s1; String s3 new String("Welcome to Java"); 那么下面表达式的结果是什么&#xff1f; (1) s1 s2 ___________true_______________ (2) s1 s3 ______…

C++ Thread 源码 观后 自我感悟 整理

Thread的主要数据成员为_Thr 里面存储的是线程句柄和线程ID 先看看赋值运算符的移动构造 最开始判断线程的ID是否不为0 _STD就是使用std的域 如果线程ID不为0&#xff0c;那么就抛出异常 这里_New_val使用了完美转发&#xff0c;交换_Val和_New_val的值 _Thr _STD exchange(_…

【动手学深度学习】深入浅出深度学习之PyTorch基础

目录 一、实验目的 二、实验准备 三、实验内容 1. 数据操作 2. 数据预处理 3. 线性代数 4. 微积分 5. 自动微分 四、实验心得 一、实验目的 &#xff08;1&#xff09;正确理解深度学习所需的数学知识&#xff1b; &#xff08;2&#xff09;学习一些关于数据的实用…

如何设置Word文档的高级属性?这里有详细步骤

我们最近向你展示了如何在Word中设置用户信息。Word还存储与文档相关的几个其他高级属性。其中一些显示在“信息”屏幕上&#xff0c;你可以更改这些属性。 注意&#xff1a;我们使用Word 2013来说明此功能。 要访问允许你更改当前打开文档的属性的对话框&#xff0c;请单击“…

使用 Amazon SageMaker 微调 Llama 2 模型

本篇文章主要介绍如何使用 Amazon SageMaker 进行 Llama 2 模型微调的示例。 这个示例主要包括: Llama 2 总体介绍Llama 2 微调介绍Llama 2 环境设置Llama 2 微调训练 前言 随着生成式 AI 的热度逐渐升高&#xff0c;国内外各种基座大语言竞相出炉&#xff0c;在其基础上衍生出…

☆【前后缀】【双指针】Leetcode 42. 接雨水

【前后缀】【双指针】Leetcode 42. 接雨水 解法1 前后缀分解解法2 双指针 ---------------&#x1f388;&#x1f388;42. 接雨水 题目链接&#x1f388;&#x1f388;------------------- 解法1 前后缀分解 维护一个前缀&#xff08;左侧最高&#xff09;后缀&#xff08;右侧…

ASP .Net Core ILogger日志服务

&#x1f433;简介 ILogger日志服务是.NET平台中的一个内置服务&#xff0c;主要用于应用程序的日志记录。它提供了灵活的日志记录机制&#xff0c;允许开发者在应用程序中轻松地添加日志功能。以下是其主要特点和组件&#xff1a; ILogger接口&#xff1a;这是ILogger日志服…

147 Linux 网络编程3 ,高并发服务器 --多路I/O转接服务器 - select

从前面的知识学习了如何通过socket &#xff0c;多进程&#xff0c;多线程创建一个高并发服务器&#xff0c;但是在实际工作中&#xff0c;我们并不会用到前面的方法 去弄一个高并发服务器&#xff0c;有更加好用的方法&#xff0c;就是多路I/O转接器 零 多路I/O转接服务器 多…

数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅰ)

1.SQL概述 SQL&#xff08;Structured Query Language&#xff09;结构化查询语言&#xff0c;是关系数据库的标准语言 SQL是一个通用的、功能极强的关系数据库语言 SQL的动词 基本概念 基本表 &#xff1a;本身独立存在的表&#xff1b; SQL中一个关系就对应一个基本表&am…

Python将字符串转换为datetime

有这样一些字符串&#xff1a; 1710903685 20240320110125 2024-03-20 11:01:25 要转换成Python的datetime 代码如下&#xff1a; import functools import re from datetime import datetime, timedelta from typing import Union# pip install python-dateutil from date…

鸿蒙Harmony应用开发—ArkTS-@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

上文所述的装饰器仅能观察到第一层的变化&#xff0c;但是在实际应用开发中&#xff0c;应用会根据开发需要&#xff0c;封装自己的数据模型。对于多层嵌套的情况&#xff0c;比如二维数组&#xff0c;或者数组项class&#xff0c;或者class的属性是class&#xff0c;他们的第二…

康奋威科技邀您到场参观2024长三角快递物流展

参展企业介绍 杭州康奋威科技股份有限公司创立于2005年&#xff0c;由国家“万人计划”专家任天挺先生创立并担任法人&#xff0c;是一家专业从事智能装备研发与制造的国家级高新技术企业。专注于自动化控制、机械设计、信息化方面的技术研究&#xff0c;主要为太阳能光伏、智…

水果软件FL Studio 21 for mac 21.2.3.3586破解版的最新版本2024介绍安装

音乐是人类最美好的语言&#xff0c;它能够跨越国界、文化和语言&#xff0c;将人们紧密地联系在一起。在当今数字化时代&#xff0c;音乐创作已经不再是专业人士的专利&#xff0c;越来越多的音乐爱好者开始尝试自己动手制作音乐。而FL Studio21中文版编曲软件正是这样一个为你…

MySQL | 用户管理

目前为止&#xff0c;我们一直使用的是root权限写的SQL语句。但如果我们只能用root&#xff0c;这样存在安全隐患。而MySQL是给我们提供了用户管理的&#xff0c;可以创建用户&#xff0c;提供权限&#xff0c;收回权限。 1. 用户 MySQL中的用户&#xff0c;都存储在系统数据库…

【零基础C语言】联合体(共用体)和枚举

目录 自定义类型&#xff1a;联合体(共用体)和枚举 1.自定义类型&#xff1a;联合体(共用体) 1.1 联合体的声明 1.2 联合体的特点 ​编辑1.3 联合体的大小计算 1.4使⽤联合体是可以节省空间的 1.5使用联合体写一个程序判断机器是大端还是小端存储 2.自定义类型&#xff1a;…

银行数字人民币系统应用架构设计

2019年10月&#xff0c;01区块链联合数字资产研究院发布了《人民币3.0&#xff1a;中国央行数字货币运行框架与技术解析》&#xff0c;从数字货币界定和人民币发展历程出发&#xff0c;区分了央行数字货币与比特币、移动支付等的区别&#xff0c;全面介绍了央行数字货币的发展历…

【Qt】使用Qt实现Web服务器(七):动态模板引擎

1、示例 2、源码 2.1 模板配置参数 配置文件中关于模板配置参数如下 path为存放模板的目录suffix为模板文件后缀[templates] path=templates suffix=.tpl encoding=UTF-8 cacheSize=1000000

springcloud+nacos服务注册与发现

快速开始 | Spring Cloud Alibaba 参考官方快速开始教程写的&#xff0c;主要注意引用的包是否正确。 这里是用的2022.0.0.0-RC2版本的springCloud&#xff0c;所以需要安装jdk21&#xff0c;参考上一个文章自行安装。 nacos-config实现配置中心功能-CSDN博客 将nacos-conf…

MySQL 排序的那些事儿

书接上回 上次发了几张图&#xff0c;给了几个MySQL Explain的场景&#xff0c;链接在这儿&#xff1a;你是不是MySQL老司机&#xff1f;来看看这些explain结果你能解释吗&#xff1f;MySQL 夺命6连问 我们依次来分析下这6个问题。 在分析之前&#xff0c;我们先来了解一下M…

GaussDB WDR分析之集群报告篇

AWR报告目前已经成为Oracle DBA分析问题&#xff0c;定位故障最为重要的报告&#xff0c;阅读与分析AWR报告的技能也是Oracle DBA必备的技能。国产数据库为了提高运维便捷性&#xff0c;都在做类似Oracle AWR报告的模仿&#xff0c;只不过由于指标体系不够完善&#xff0c;因此…