文件的使用(初阶)

前言:

       我们先来看一个内存使用图:

       这其中内核空间用户代码是不能读写的专门留给操作系统内核去使用。

       但是这一篇我们来讲文件(上方内存图意义不明,哈哈,权当复习)。

       文件是用来存放数据的,但是真正当我们进入工作以后这些数据是不会放在文件当中的,这些数据会放在数据库当中。所以文件这种操作一般用的比较少,但是我们还是要掌握,我们有时可能会使用配置文件,所以还是至少要了解一些。

为什么使用文件?

       为什么使用文件?我们写的程序的数据是存储在电脑内存中的,如果程序退出,内存回收,数据就丢失了,等再次运行程序,就要重新开始,看不到上次程序的数据,如果要将数据进行持久化的保存,我们可以使用文件。

文件是什么?

       磁盘(硬盘)上的文件是文件。但在程序设计中,文件这里一般分为两种文件:

  1. 程序文件
    包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
  2. 数据文件
    文件内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取的文件,或者输出内容的文件。
    这里我们讨论数据文件,之前所处理数据的输入输出都是以终端为对象的,即从终端设备的键盘输入数据,运行结果显示到显示器上。但有时候我们会把信息输出到磁盘上,当需要的时候在从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上的文件。

文件名: 

       一个文件要有一个唯一的文件标识,以便用户识别和使用。

       文件名包含三个部分:文件路径+文件名主干+文件后缀。

例如:c:\code\test.txt

数据文件类型: 

       我们已经知道文件分为两种,程序文件和数据文件,那么其实根据数据的组成形式,数据文件被称为文本文件或者二进制文件

       数据在内存中以二进制的形式存储,如果不加转换的输出到外存就是二进制文件。比如我们打开一个不是以txt文件结尾并且也不是对应打开方式的文件,就会遇到以下情况:

       是不是很熟悉,接下来我就解释一下是为什么。 

数据在文件中的存储

       一个数据在文件中是怎么存储的呢?字符一律以ASCII形式存储;数值类型数据既可以用ASCII形式存储,也可以用二进制形式存储。

       比如整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节。

        以上截图先不要看代码,是我们以二进制方式将10000写入文件,直接打开都是以文本文件打开的(就是读取内存,根据ASCII码转换为对应字符)。

        此时就需要用到二进制文件来读取了。

int main()
{int a = 10000;FILE* pf = fopen("C:\\Users\\Administrator\\Desktop\\test.txt", "wb");fwrite(&a, 4, 1, pf);//二进制的形式写入文件中fclose(pf);//关闭pf = NULL;return 0;
}

        此时我们在原文件上面添加现有项,将桌面上的文件添加到VS中。

        之后选二进制编辑器形式打开:

       此时我们先看10000在VS中的存储: (关于大小端知识,可以看这一篇文章:大端和小端存储模式-CSDN博客 不影响阅读)

        此时二进制读取就是正确的(墙面的0可以暂时忽略,编译器原因):

        此时就会理解数据文件,内容不一定是程序,而是程序运行是读写的数据。可以发现以上我们使用VS的程序文件操作一个后缀为txt的文件,所以可以得出结论:程序文件是来操作数据文件的。

        我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同外部设备的输入输出操作各不相同,为方便程序员对各种设备进行方便操作,我们抽象出了流的概念。

什么是流?

       百度结果:流是个抽象的概念,是对输入输出设备的抽象。

       我们可以把流想象成流淌着字符的河。C程序针对文件、画面、键盘等数据输入输出都是通过流操作的。一般情况下,我们要想向流里写数据,或者从流中读取数据, 都是打开流,然后操作的。

       接下来我来给出我的理解(不对请大佬在评论区讲解):就是我们可以把流想象成控制数据流动的方向,我们可以通过指定流来控制数据的流向。

       那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?因为C语言程序在启动的时候,默认就打开了3个流。

  1. stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
  2. stdout - 标准输出流,大多数的环境种输出至显示器界面,printf函数就是将信息输出到标准输出流中。
  3. stderr - 标准错误流,大多数环境中输出到显示器界面。

       这是默认打开的三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。

       stdin、stdout、stderr三个流的类型是:FILE*,通常称为文件指针

       C语言中,就是通过FILE*的文件指针来维护各种流的操作的。

文件指针

        缓冲文件系统中,关键概念是“文件类型指针”,简称“文件指针”。

       每一个被打开的文件,就会有一个跟它相关的文件信息区。只要打开文件就会创建文件信息区(如文件的名字,文件状态寄文件当前位置)。其实这些信息是保存在一个结构体变量中的,该结构体类型是由系统声明,取名FILE。

       我们来看C语言的定义:

struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;

        不同C编译器的FILE类型包含的内容不完全相同,但大同小异。

       每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中信息,我们使用并不用关注细节。

       一般是通过一个FILE的指针来维护FILE结构的变量,这样使用起来更加方便。下面我们可以创建一个FILE*的指针变量:

FILE* pf;//文件指针变量

       定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过文件信息区中的信息就能够访问该文件。也就是说,通过指针变量能够间接找到与它关联的文件。

 

 

文件的打开与关闭 

       我们是用文件就需要先打开文件,之后使用完以后关闭文件。C规定使用fopen来打开文件,flose来关闭文件。我们先来看fopen的声明。

        可以发现返回的是文件指针所以我们定义一个文件指针类型来接收,我们主要观察mode,上面写给定的模式mode打开文件,这里就需要逐个讲解了。

        插一嘴,因为fopen打开失败文件会返回NULL,所以和动态内存函数一样,我们要先判断是否打开成功,之后再进行正常功能的使用:

if (pf == NULL)
{perror("fopen");//使用perror函数来打印错误内容//等同于printf + strerror 函数return 1;
}

写文件: 

       模式为w,如果没有则创建文件,有则在文件中写数据:

int main()
{//打开文件,为了写//如果文件打开失败,会返回空指针FILE* pf = fopen("data.txt", "w");//所以检查一下if (pf == NULL){perror("fopen");return 1;}//关闭文件fclose(pf);//因为fclose没有能力将其置空//所以还需要手动置空,防止野指针出现pf = NULL;return 0;
}

        关闭文件就直接使用fclose即可,我们不再赘述,文件指针使用规律和动态内存函数相似,详情请看动态内存函数-CSDN博客

        这里就又会有人问道:文件名不是路径名+文件名+后缀名吗?为啥这只有文件名和后缀名?其实这里是分为绝对路径和相对路径的。

  • 绝对路径:大家多学过地理,知道西经东经,南纬北纬,一经一纬就可以确定一个地点。再比如,我直接说新乡,你肯定不知道是哪里。但是我说河南省新乡市新乡县就会知道大致位置,这就是绝对路径。
  • 相对路径:就是相对于当前在哪里。比如我说503,你肯定又懵了,但是是我的老板,就知道503在哪里。我必须说成上海xx酒店503,说成绝对位置,你就会知道是哪里了。

       此时就以写的方式,在当前的路径下,写了一个data.txt的文件,如果有,则直接往里面写,如果没有就创建一个。

读文件: 

       此时我们将刚才的文件删除掉,并直接以读的方式编辑(因为没有该文件,所以报错)。

        当我们使用绝对路径时,为了方式转义,我们使用双斜杠来使转义失效(就是我上面的一串代码)。

FILE* pf = fopen("C:\\Users\\Administrator\\Desktop\\test.txt", "w");

        相对路径的使用中,还有很多有趣操作,比如:

int main() 
{//打开文件,为了写//如果文件打开失败,会返回空指针//.  表示当前目录//.. 表示上一级目录FILE* pf = fopen("./../data1.txt", "w");//此时就是在当前文件的上一级目录写一个文件//所以检查一下if (pf == NULL){perror("fopen");return 1;}//关闭文件fclose(pf);//因为fclose没有能力将其置空//所以还需要手动置空,防止野指针出现pf = NULL;return 0;
}

       此时就在当前文件的上一级文件创建了一个新的data1.txt文件 。注意以上我们用的是相对路径,所以可以不用双斜杠使其转义失效;但是用绝对路径时就需要使用双斜杠。

       我们还是使用相对路径,在该路径下生成的data中编辑。此时我们在我们创建好的文件中写入数据。

        之后关闭,并在执行一次代码(注:此时我们在文件中已经写入了内容),并打开文件观察结果:

        发现刚才写入的值消失了。 所以会发现我们直接在文件中写入数据还是不会保留结果的,所以我们就需要使用文件函数来对文件写入数据。

文件读写顺序:

文件函数:

        为了使用C语言来编写文件,C语言给出了很多关于操作文件的函数(这样才能保留)。​​​​​​​

        打开文件后,接下来我们就来讲解这些函数的使用。

fputc:

        写入文件字符函数。

int main()
{//打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}//写文件fputc('a', pf);fputc('b', pf);fputc('c', pf);fputc('d', pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

        当然,我们也可以使用循环往里面写我们利用循环写入26个音文字母,并在控制台打印结果,此时就需要用到标准输出流(就像我前面解释的那样,暂时可以理解为数据流向了控制台,没有流向文件,博主水平太次,但大致确实是这个意思,以后会了会详细讲解):

int main()
{//打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}写文件//fputc('a', pf);//fputc('b', pf);//fputc('c', pf);//fputc('d', pf);int i = 0; for (i = 0; i < 26; i++){fputc('a' + i, stdout);}//关闭文件fclose(pf);pf = NULL;return 0;
}

fgetc: 

       此时我们打开文件并以读的方式,我们先项文件中写入一些数据,之后读取文件中的数据。

int main()
{//打开文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读文件int ch = fgetc(pf);printf("%c\n", ch);//ach = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);//关闭文件fclose(pf);pf = NULL;return 0;
}

       这里其实是根据光标来判断起始位置的。 第一次读完以后光标会移动,按顺序往后面跑。

       之后我们利用这两个函数进行拷贝文件(注:文件data1.txt中已经有数据):

//写一个代码,完成将data1.txt文件的内容,拷贝生成data2.txt文件//从data1.txt中读取数据
//写到data2.txt文件中
int main()
{FILE* pfread = fopen("data1.txt", "r");if (pfread == NULL){perror("fopen->data1.txt");return 1;}FILE* pfwrite = fopen("data2.txt", "w");if (pfwrite == NULL){//第二个文件打开失败//关闭第一个文件fclose(pfread);pfread = NULL;perror("fopen->data2.txt");return 1;}//拷贝int ch = 0;while ((ch = fgetc(pfread)) != EOF){//EOF是文件结束标志fputc(ch, pfwrite);}fclose(pfread);fclose(pfwrite);pfread = NULL;pfwrite = NULL;return 0;
}

       成功拷贝文件。 

fputs:

        这里还是以写文件的形式,虽然有返回值,但是我们可以不进行接收。不同于fputc,它是一次性写入整个字符。

int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("pf");return 1;}//写文件 - 写一行fputs("abcdef", pf);fputs("abcdef", pf);//关闭fclose(pf);pf = NULL;return 0;
}

        这里我们每次写入一行,并没有换行,所以结果是一行内容。

        此时我们进行换行操作:

int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("pf");return 1;}//写文件 - 写一行fputs("abcdef\n", pf);fputs("abcdef\n", pf);//关闭fclose(pf);pf = NULL;return 0;
}

fgets: 

        此时我们就需要进行读文件的操作了。比如此时文件中数据是abcdefabcdef。之后我们将其拷贝到字符串中(这里注意观察n的值,只是复制了n-1个,最后一个是\0)。

int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("pf");return 1;}//读取char arr[20] = "xxxxxxxxxxxxx";//char * fgets(char *str, int n, FILE *stream)//从指定流(文件)中读取 n - 1 个数据//并把它存储在str中fgets(arr, 10, pf);//此时将arr改变printf("%s\n", arr);fclose(pf);pf = NULL;return 0;
}

小总结请允许我这里先总结一下,以免防止搞混。我们发现,我们可以把文件当做控制台,fgets函数类似gets函数的使用,获取字符串;fputs函数类似puts函数的使用,输出字符串。

输出当然要输出到控制台中,但此时控制台是文件,所以就相当于写文件。

获取字符串需要有现成的字符串, 所以就是从控制台中拿数据,所以就是读文件。

 fprintf:

       这里我们可以发现,它仅仅比printf函数多了一个f,很明显就是针对文件的。我们来看它和printf函数的差别:

        可以发现,就多出了一个指定方向的流,后面的…是参数列表,我们可以先不讨论。既然前面是针对的流,所以我们把它指定到文件中去。

       fprintf顾名思义,根据我们以上的总结,就是写文件使用到(因为把数据输出到文件中去,所以是写文件)。这里我们使结构体,并写入文件:

struct Stu
{char name[20];int age;float score;
};int main()
{struct Stu s = { "zhangsan", 20, 90.5f };FILE* pf = fopen("data.txt", "w");if (pf == NULL){return 1;}//写文件//类比 - printf//printf("%s %d %f\n", s.name, s.age, s.score);fprintf(pf, "%s %d %.2f\n", s.name, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

fscanf: 

       和fprintf函数一样。

       fscanf就是从文件中读数据, 之后指定方向输出,比如下方我们结合fprintf函数使用。

struct Stu
{char name[20];int age;float score;
};int main()
{struct Stu s = { "zhangsan", 20, 90.5f };//此时为读文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){return 1;}//读文件//类比 - scanf//scanf("%s %d %f\n", s.name, &(s.age), &(s.score));fscanf(pf, "%s %d %f\n", s.name, &(s.age), &(s.score));//相当于从文件当中写到控制台里面去//打印fprintf(stdout, "%s %d %.2f\n", s.name, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

       注意以上是将fprintf指定的输出流到控制台中。 

fwrite: 

       这个函数以二进制方式写入文件的,我们先来看声明。

        这个函数被要求要写入个数,和大小,并且只适用于文件。因为是以二进制方式写入文件,所以我们打开文件要使用“wb”方式。

struct Stu
{char name[20];int age;float score;
};int main()
{struct Stu s = { "zhangsan", 20, 90.5f };FILE* pf = fopen("data.txt", "wb");//以二进制写文件if (pf == NULL){return 1;}//二进制形式写文件fwrite(&s, sizeof(s), 1, pf);//一个元素fclose(pf);pf = NULL;return 0;
}

        此时我们可以打开看看文件中到底存储着什么:

        前面我们将解数据文件中有提到过,字符存储不受影响,只有针对数值才会出现乱码,此时也就验证了结果。

fread:

       既然以二进制的方式写入了数据,那么使用二进制的方式读数据对应起来就不会出错了,所以要使用fread函数(二进制方式输出)。

        不难发现,它和fwrite韩式的使用很相似,但是可以理解为是从后向前的,因为先指定从哪个流中读取数据,之后放到哪里。

        接下来我们就以二进制方式写入,并以二进制方式读取。

struct Stu
{char name[20];int age;float score;
};int main()
{struct Stu s = { "zhangsan", 20, 90.5f };FILE* pf = fopen("data.txt", "rb");//以二进制读文件if (pf == NULL){return 1;}//二进制形式写文件fread(&s, sizeof(s), 1, pf);//一个元素printf("%s %d %f\n", s.name, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

        这样就不会出现问题。

总结:

       文件我们实际生活使用的比较少,但是也需要了解,而且有些地方也容易搞混。所以要多加积累。

       终于到这一步了,真的很辛苦,这一篇我很想逃避,因为博主真的不是非常了解这一章,但是还是要迎难而上,我接下来会进行JAVA的学习,希望大家多加支持,不足之处请在评论区指出,感谢各位。​​​​​​​

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

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

相关文章

配置BGP的基本示例

BGP简介 定义 边界网关协议BGP&#xff08;Border Gateway Protocol&#xff09;是一种实现自治系统AS&#xff08;Autonomous System&#xff09;之间的路由可达&#xff0c;并选择最佳路由的距离矢量路由协议。早期发布的三个版本分别是BGP-1&#xff08;RFC1105&#xff0…

核货宝订单管理系统提高企业效率

核货宝订单管理系统可以帮助企业提高效率&#xff0c;具体体现在以下几个方面&#xff1a; 一、订单自动化处理&#xff1a;核货宝订单管理系统支持订单批发和多渠道订单导入&#xff0c;它可以从订单的接收、处理、跟进、发货、到售后服务等环节都可以通过系统自动完成&#x…

再看参数校验

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 写一个接口&#xff0c…

OpenFeign 万字教程详解

OpenFeign 万字教程详解 目录 一、概述 1.1.OpenFeign是什么&#xff1f;1.2.OpenFeign能干什么1.3.OpenFeign和Feign的区别1.4.FeignClient 二、OpenFeign使用 2.1.OpenFeign 常规远程调用2.2.OpenFeign 微服务使用步骤2.3.OpenFeign 超时控制2.4.OpenFeign 日志打印2.5.O…

数据可视化:赋能企业决策的视觉力量

数据可视化在企业中扮演着至关重要的角色&#xff0c;为决策者提供了直观、深入的数据解读&#xff0c;帮助他们更好地理解业务状况并作出明智的决策。今天我就以可视化从业者的角度来简谈说说如何让数据可视化为更好地为企业服务。 首先&#xff0c;数据可视化可以让数据更易…

HFish蜜罐搭建及简单使用

一、HFish蜜罐 HFish是一款社区型免费蜜罐&#xff0c;侧重企业安全场景&#xff0c;从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发&#xff0c;为用户提供可独立操作且实用的功能&#xff0c;通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷感知和威胁情报领域的…

类和对象(下篇)

再谈构造函数 构造函数体赋值 在之前的学习中我们知道&#xff0c;在创建一个对象时&#xff0c;我们的编译器就会自动调用构造函数将对象初始化&#xff0c;给对象中各个成员变量一个合适的初始值。 例如&#xff1a; class Date { public:Date(int year, int month, int d…

【pentaho】kettle读取Hive表不支持bigint和timstamp类型解决。

一、bigint类型 报错: Unable to get value BigNumber(16) from database resultset显示kettle认为此应该是decimal类型(kettle中是TYPE_BIGNUMBER或称BigNumber)&#xff0c;但实际hive数据库中是big类型。 修改kettle源码解决&#xff1a; kettle中java.sql.Types到kettle…

创建Github Pages 仓库

Github Pages 仓库创建 1. 在 GitHub 上创建一个新仓库2. 在仓库中创建一个分支&#xff08;可选&#xff0c;可跳过&#xff09;3. 创建您的静态网站4. 启用 GitHub Pages5. 等待构建完成6. 访问您的网站 在 GitHub 上创建一个 GitHub Pages 仓库是相对简单的。GitHub Pages 允…

JMeter---JSON提取器

JMeter的JSON提取器是一个用于从JSON响应中提取数据的元件。它可以从JSON响应中提取特定字段的值&#xff0c;并将这些值用于后续的测试步骤。 使用JSON提取器的步骤如下&#xff1a; 添加一个HTTP请求&#xff0c;用于获取包含JSON响应的数据。 在HTTP请求之后添加一个JSON提…

数字图像处理-空间域图像增强-爆肝18小时用通俗语言进行超详细的总结

目录 灰度变换 直方图&#xff08;Histogram&#xff09; 直方图均衡 直方图匹配&#xff08;规定化&#xff09; 空间滤波 低通滤波器 高通滤波器 ​​​​​​​ 本文章讲解数字图像处理空间域图像增强&#xff0c;大部分内容来源于课堂笔记中 灰度变换 图像增强&…

万界星空开源MES/注塑MES/开源注塑MES/免费MES/MES源码

一、系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES、好看的数据大屏、功能齐全开源mes. 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理&#xff0c;车间基础数据管理&…

【大模型】LLM显存占用对比:Qwen-7B-Chat,Qwen-14B-Chat-Int8,chatglm3-6b

【大模型】LLM显存占用对比&#xff1a;Qwen-7B-Chat&#xff0c;Qwen-14B-Chat-Int8&#xff0c;chatglm3-6b 显存占用对比&#xff1a;总结参考 显存占用对比&#xff1a; 显卡&#xff1a;NVIDIA GeForce RTX 4090 系统环境&#xff1a;ubuntu 22.04LTS Qwen-14B-Chat-Int8…

VScode 工作区配置 和 用户配置

一、工作区配置 通常不同的项目都有不同的配置&#xff0c;我一般都是使用eslint和prettier一起用&#xff0c;所以经常会有这几个文件&#xff1a; 这里简单介绍一下这几个文件的作用吧。 1.vscode文件夹下 一般有两个文件&#xff0c;extensions.json和settings.json。 e…

[Linux] LVS+Keepalived高可用集群部署

一、Keepalived实现原理 1.1 高可用方案 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题。 在一个LVS服务集群中通常有主服务器&#xff08;MASTER&#xff09;和备份服务器&#xff08;BACKUP&#xff09;两种角色…

WEB 3D技术 three.js 设置图像随窗口大小变化而变化

本文 我们来讲讲我们图层适应窗口变化的效果 可能这样说有点笼统 那么 自适应应该大家更熟悉 就是 当我们窗口发生变化说 做一些界面调整比例 例如 我们这样一个i项目界面 我们打开 F12 明显有一部分被挡住了 那么 我们可以刷新 这样是正常了 但是 我们将F12关掉 给F12的…

FFmpeg 简单文档

一、播放器框架 常用音视频术语 容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a;即特定格式的多媒体文件&#xff0c;比如mp4、flv、mkv等。媒体流&#xff08;Stream&#xff09;&#xff1a;表示时间轴上的一段连续数据&#xff0c;如一段声音数据、…

解决找不到vcruntime140.dll无法继续执行的多种方法分享

最近&#xff0c;我在使用电脑时遇到了一个问题&#xff0c;即“由于找不到vcruntime140.dll无法继续执行”。vcruntime140.dll是Visual C Redistributable Packages中的一个组件&#xff0c;它是Visual Studio 2015中运行C程序所必需的。如果找不到vcruntime140.dll文件&#…

【Jenkins】远程API接口:Java 包装接口使用示例

jenkins-rest 库是一个面向对象的 Java 项目&#xff0c;它通过编程方式提供对 Jenkins REST API 的访问&#xff0c;以访问 Jenkins 提供的一些远程 API。它使用 jclouds 工具包构建&#xff0c;可以轻松扩展以支持更多 REST 端点。其功能集不断发展&#xff0c;用户可以通过拉…

Spring中你一定要知道的afterPropertiesSet()

文章目录 功能源码 功能 初始化bean执行的回调方法其一&#xff0c;它不像PostConstruct一样可以有多个&#xff0c;只能调用一次&#xff1b;它执行的时机是在PostConstruct之后&#xff0c;从它的名称也可以看出&#xff0c;他是在属性填充完&#xff0c;也就是bean初始化完…