学习记录——day22 文件IO

          文件IO是使用系统调用(内核提供的函数)来完成数据的读写操作,不提供缓冲区,基于文件描述符操作文件,每进行一次文件io操作,进程就会从用户空间向内核空间进行一次切换,效率没有标准io高。

文件描述符

        1、文件描述符本质上是一个整数,当文件存储在本地磁盘时,属于静态文件,当使用open函数打开文件时,该文件就属于动态文件,后期需要对文件进行操作的化就需要基于一个句柄来完成,这个句柄就是文件描述符,用一个整数表示。

        2、文件描述符是一个非负整数,一个进程能够使用的文件描述符默认为1024个【0,1023】,可以通过指令uimit -a查看,并且可以通过ulimit -n进行修改进程能够打开的文件描述符个数

         3、使用原则: 最小未分配原则

        4、特殊的文件描述符:0、1、2,分别对应了标准输入、标准输出、标准出错

stdin->_fileno     ===>   0    ===> STDIN_FILENO
stdout->_fileno    ===>  1    ===> STDOUT_FILENO
stderr->_fileno    ===>  2    ===> STDERR_FILENO

#include <myhead.h>int main(int argc, char const *argv[])
{printf("stdin -> _fileno = %d\n",stdin ->_fileno);  //0printf("stdout -> _fileno = %d\n",stdout ->_fileno); //1printf("stderr -> _fileno = %d\n",stderr ->_fileno); //2FILE *fp = NULL;if ((fp = fopen("./file.txt","w")) == NULL){perror("fopen error");return -1;}printf("fp -> _fileno = %d\n", fp -> _fileno);//3 最小未分配return 0;
}

 

myhead.h 包含头文件如下

open打开文件

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);
        功能:以指定的方式打开指定的文件
        参数1:要打开的文件路径
        参数2:文件打开标识
            必须包含以下三者之一:
                O_RDONLY:以只读的形式打开文件
                O_WRONLY:以只写的形式打开文件
                O_RDWR:以读写的形式打开文件
            以下的可以选择性加入,使用位或完成:
                O_CREAT:如果文件存在,就直接打开,如果文件不存在,则创建文件,此时,参数3必须要加,表示创建的文件权限
                O_TRUNC:表示清空文件内容
                O_APPEND:以追加的形式打开文件
                O_EXCL:确保打开的是不存在的文件,通常跟O_CREAT一起使用,

                                表示本次操作必须创建新文件,如果文件存在,则open函数报错,错误                                   码为:EEXIST
——————————————————————————————————————
                "r":O_RDONLY
                "r+":O_RDWR
                "w":O_WRONLY|O_CREAT|O_TRUNC
                "w+":O_RDWR|O_CREAT|O_TRUNC
                "a":O_WRONLY|O_APPEND|O_CREAT
                "a+":O_RDWR|O_APPEND|O_CREAT

——————————————————————————————————————
            参数3:

当参数2中有O_CREAT属性时,参数3必须加上,表示本次创建文件的文件权 限,

                但是,最终的权限不是用户给定的权限,

                  文件最终的权限是 给定的权限                          mode&~umask的值,umask可以通过指令umask进行查看当前终端的默认掩码,
           可以通过 umask -n   来将掩码更改成 n,但是,这种方式更改的umask只在当前终端              有效,其他终端无效
           也可以通过umask(n)来更改umask的值
                  #include <sys/stat.h>

                 mode_t umask(mode_t cmask);
                 功能:更改当前的umask的值
                 参数:要更改的umask的值
            普通文件权限一般为:0664
            目录文件权限一般为:0775
         ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
         返回值:成功返回一个新的文件描述符,失败返回-1并置位错误码                      
        

man  fopen

close 关闭文件

       #include <unistd.h>

       int close(int fd);
    功能:关闭文件描述符
    参数:要关闭的文件描述符
    返回值:成功返回0,失败返回-1并置位错误码
    

       #include <unistd.h>int close(int fd);功能:关闭文件描述符参数:要关闭的文件描述符返回值:成功返回0,失败返回-1并置位错误码
#include<myhead.h>int main(int argc, const char *argv[])
{//创建一个文件描述符变量,用于存储文件描述符int fd = -1;if((fd = open("./file.txt", O_WRONLY|O_CREAT|O_TRUNC, 0664)) == -1){perror("open error");return -1;}printf("open success fd = %d\n", fd);     //3//关闭文件if(close(fd) == -1){perror("close fd 1");return -1;}return 0;
}

read/write 数据读写

       #include <unistd.h>

       ssize_t write(int fd, const void *buf, size_t count);
    功能:向指定的文件中,写入指定的信息
    参数1:已打开的文件描述符
    参数2:要写入的数据的起始地址
    参数3:要写入的数据大小
    返回值:成功返回写入字符的个数,失败返回-1并置位错误码
    
           #include <unistd.h>

       ssize_t read(int fd, void *buf, size_t count);
    功能:从指定的文件中读取count个字节的数据到buf中
    参数1:打开的文件描述符
    参数2:要存放数据的容器起始地址
    参数3:要读取的字节个数
    返回值:成功返回读取字节的个数,失败返回-1并置位错误码

       #include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);功能:向指定的文件中,写入指定的信息参数1:已打开的文件描述符参数2:要写入的数据的起始地址参数3:要写入的数据大小返回值:成功返回写入字符的个数,失败返回-1并置位错误码#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);功能:从指定的文件中读取count个字节的数据到buf中参数1:打开的文件描述符参数2:要存放数据的容器起始地址参数3:要读取的字节个数返回值:成功返回读取字节的个数,失败返回-1并置位错误码
#include <myhead.h>typedef struct
{char name[20];int age;double score;
} Stu;int main(int argc, char const *argv[])
{int fd = -1; // 创建一个文件描述符变量,用于存储文件描述符if ((fd = open("./file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664)) == -1){perror("open error");return -1;}printf("open success fd = %d\n", fd); // 3Stu s[3] = {{"张三", 10, 99.5}, {"李四", 18, 90.5}, {"王五", 16, 89.5}};write(fd, s, sizeof(s));// 关闭文件if (close(fd) == -1){perror("close fd 1");return -1;}if ((fd = open("./file.txt", O_RDONLY, 0664)) == -1){perror("open error");return -1;}printf("open success fd = %d\n", fd); // 3Stu temp;read(fd,&temp,sizeof(temp));printf("%s %d %.2lf\n",temp.name,temp.age,temp.score);return 0;
}

lseek

       #include <sys/types.h>
       #include <unistd.h>

       off_t lseek(int fd, off_t offset, int whence);
    功能:移动文件的光标
    参数1:文件描述符
    参数2:偏移量
            >0:向后偏移
            =0:不偏移
            <0:向前偏移
    参数3:偏移起始位置
            SEEK_SET:文件开头
            SEEK_END:文件结尾
            SEEK_CUR:文件当前位置
    返回值:成功返回文件光标当前的位置,失败返回-1并置位错误码

#include<myhead.h>int main(int argc, const char *argv[])
{//打开文件,以读写的形式int fd = -1;if((fd = open("./gg.bmp", O_RDWR)) == -1){perror("open error");return -1;}//偏移光标lseek(fd, 2, SEEK_SET);//定义变量接受大小int img_size = 0;read(fd, &img_size, sizeof(img_size));printf("img_size = %d\n", img_size);//将光标直接偏移到文件末尾,返回值就是文件大小printf("size = %ld\n", lseek(fd, 0, SEEK_END));//关闭文件close(fd);return 0;
}

使用文件IO完成两个文件的拷贝

#include <myhead.h>
int main(int argc, char const *argv[])
{if (argc != 3){// printf("终端输入有误\n");write(2,"input file error\n",sizeof("input file error\n"));return -1;}umask(0000);int fd = open(argv[1],O_RDONLY);int fb = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0664);char temp[128] = "";while (1){int flag = read(fd,temp,sizeof(temp));if (flag == 0){break;}write(fb,temp,flag);}//下面子规方法会拷贝多余的信息// while (read(fd,temp,sizeof(temp)))// {//     write(fb,temp,sizeof(temp));// }close(fd);close(fb);return 0;
}

文件描述符拷贝问题

拷贝用文件:

1、简单完成两个文件描述符变量的拷贝

        这种情况下,没有新文件描述符产生,使用的是同一个文件描述符,共享同一个文件光标

#include <myhead.h>
int main(int argc, char const *argv[])
{int fd1 = -1;if ((fd1 = open("./file2.txt",O_RDONLY)) == -1){perror("open eroor");return -1;}//1、// int fd2 = fd1;  //定义变量存储文件描述符     //                 //未出现新的文件描述符fd1 fd2 公用光标//2、   // int fd2 = dup(fd1); //出现新的文件描述符  //                     //但仍然公用光标lseek(fd2,8,SEEK_SET);  //光标偏移char buf[128] = "";read(fd1,buf,5);printf("buf = %s\n",buf);  //1、buf = 55555   //2、buf = 55555  close(fd1);return 0;
}

2、dup函数完成拷贝

        该操作,会生成新的文件描述符,但是与旧的文件描述符共享同一个光标

#include <myhead.h>
int main(int argc, char const *argv[])
{int fd1 = -1;if ((fd1 = open("./file2.txt",O_RDONLY)) == -1){perror("open eroor");return -1;}//1、// int fd2 = fd1;  //定义变量存储文件描述符     //                 //未出现新的文件描述符fd1 fd2 公用光标//2、   // int fd2 = dup(fd1); //出现新的文件描述符  //                     //但仍然公用光标lseek(fd2,8,SEEK_SET);  //光标偏移char buf[128] = "";read(fd1,buf,5);printf("buf = %s\n",buf);  //1、buf = 55555   //2、buf = 55555  close(fd1);return 0;
}

3、使用dup2拷贝文件描述符

       int dup2(int oldfd, int newfd);
    功能:拷贝旧文件描述符,放入新文件描述符中,如果新文件描述符之前已经打开,则在拷贝时,默认将其关闭
    参数1:旧文件描述符
    参数2:新文件描述符
    返回值:成功返回新文件描述符,失败返回-1并置位错误码

#include <myhead.h>
int main(int argc, char const *argv[])
{int fd2 = open("./04.c",O_RDONLY);int fd1 = open("./file2.txt",O_RDONLY);//使fd2指向fd1指向的文件,fd2原本指向的文件静默关闭dup2(fd1,fd2);  //不产生新的文件描述符//共用光标printf("fd1= %d,fd2 = %d\n",fd1,fd2); //4  3lseek(fd2,8,SEEK_SET);char buf[128] = "";read(fd1,buf,5);printf("buf = %s\n",buf);  //buf = 55555close(fd1);close(fd2);return 0;
}

4、dup2的常规用法

#include <myhead.h>
int main(int argc, char const *argv[])
{int fd = -1;if ((fd = open("./aa.txt",O_WRONLY|O_CREAT|O_TRUNC))){perror("open error");return -1;}//将标准输出重定向到fd中,标准输出静默关闭dup2(fd,STDOUT_FILENO);dup2(fd,STDIN_FILENO);//将标准输入重定向到fd中dup2(fd,STDERR_FILENO);//将标准出错重定向到fd中printf("hello\n");return 0;
}

5、多次使用open函数打开同一个文件时,这多个文件描述符是不共享文件光标的

#include <myhead.h>
int main(int argc, char const *argv[])
{int fd1 = -1;if ((fd1 = open("./file2.txt",O_RDONLY))){perror("open error");return -1;}int fd2 = -1;if ((fd2 = open("./file2.txt",O_RDONLY))){perror("open error");return -1;}lseek(fd1,8,SEEK_SET);  //移动fd1的光标char buf[10] = ""; //从读取fd2的指向读取数据read(fd2,,buf,5);printf("%s\n",buf); //  55555return 0;
}

文件属性函数

stat 函数原型 

       #include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int stat(const char *pathname, struct stat *statbuf);功能:获取给定的文件状态属性参数1:要获取的文件名参数2:文件属性结构体指针,是一个地址传递,需要传递一个结构体变量的地址,通过函数调用结束后,该变量中就有内容了struct stat {dev_t     st_dev;         /* 设备号 */ino_t     st_ino;         /* Inode 号 */mode_t    st_mode;        /* 文件类型和文件权限 */nlink_t   st_nlink;       /* 硬链接数 */uid_t     st_uid;         /* 拥有者的用户id号 */gid_t     st_gid;         /* 拥有者的组id号 */dev_t     st_rdev;        /* 特殊文件的设备号 */off_t     st_size;        /* 总大小,以字节为单位 */blksize_t st_blksize;     /* 块的大小 */blkcnt_t  st_blocks;      /* 总块数 */};如何获取文件的类型和文件权限1>    使用st_mode & S_IFMT可以得到文件的类型S_IFSOCK   0140000   socketS_IFLNK    0120000   symbolic linkS_IFREG    0100000   regular fileS_IFBLK    0060000   block deviceS_IFDIR    0040000   directoryS_IFCHR    0020000   character deviceS_IFIFO    0010000   FIFO2>    使用st_mode & 0777可以得到文件的权限S_ISUID     04000   set-user-ID bitS_ISGID     02000   set-group-ID bit (see below)S_ISVTX     01000   sticky bit (see below)S_IRWXU     00700   owner has read, write, and execute permissionS_IRUSR     00400   owner has read permissionS_IWUSR     00200   owner has write permissionS_IXUSR     00100   owner has execute permissionS_IRWXG     00070   group has read, write, and execute permissionS_IRGRP     00040   group has read permissionS_IWGRP     00020   group has write permissionS_IXGRP     00010   group has execute permissionS_IRWXO     00007   others (not in group) have read,  write,  andexecute permissionS_IROTH     00004   others have read permissionS_IWOTH     00002   others have write permissionS_IXOTH     00001   others have execute permission返回值:成功返回0,失败返回-1并置位错误码
#include<myhead.h>int main(int argc, const char *argv[])
{//判断外部传来的文件if(argc != 2){printf("input file error\n");return -1;}//定义接受文件的属性结构体变量struct stat sb;                 //stat buf//调用函数,获取文件状态if(stat(argv[1], &sb) == -1){perror("stat error");return -1;}//程序执行至此,sb中就记录了传入的文件的信息//输出文件类型switch(sb.st_mode & S_IFMT){case S_IFSOCK:{printf("套接字文件\t");}break;case S_IFLNK:{printf("链接文件\t");}break;case S_IFREG:{printf("普通文件\t");}break;case S_IFBLK:{printf("块设备文件\t");}break;case S_IFDIR:{printf("目录文件\t");}break;case S_IFCHR:{printf("字符设备文件\t");}break;case S_IFIFO:{printf("管道文件\t");}break;}//输出文件权限printf("%#o\t", sb.st_mode&0777);//输出文件大小printf("%ld\t", sb.st_size);//输出文件inode号printf("%ld\n", sb.st_ino);return 0;
}

使用文件I0完成,将源文件中的所有内容进行加密(大写转小写、小写转大写)后写入目标文件中源文件内容不变

#include <myhead.h>
int main(int argc, char const *argv[])
{if (argc != 3){// printf("终端输入有误\n");write(2, "input file error\n", sizeof("input file error\n"));return -1;}umask(0000);int fd = open(argv[1], O_RDONLY);int fb = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0664);char temp = {0}; // 定义中转变量while (1){int flag = read(fd, &temp, 1);if (flag == 0){break;}if (temp >= 'A' && temp <= 'Z') // 大小转小写{temp = temp + 32;}else if (temp >= 'a' && temp <= 'z') // 小写转大写{temp = temp - 32;}write(fb, &temp, flag);}close(fd);close(fb);return 0;
}

结果

#INCLUDE <MYHEAD.H>
INT MAIN(INT ARGC, CHAR CONST *ARGV[])
{
    IF (ARGC != 3)
    {
        // PRINTF("终端输入有误\N");
        WRITE(2, "INPUT FILE ERROR\N", SIZEOF("INPUT FILE ERROR\N"));
        RETURN -1;
    }

    UMASK(0000);

    INT FD = OPEN(ARGV[1], o_rdonly);
    INT FB = OPEN(ARGV[2], o_rdwr | o_creat | o_trunc, 0664);

    CHAR TEMP = {0}; // 定义中转变量

    WHILE (1)
    {
        INT FLAG = READ(FD, &TEMP, 1);
        IF (FLAG == 0)
        {
            BREAK;
        }
        IF (TEMP >= 'a' && TEMP <= 'z') // 大小转小写
        {
            TEMP = TEMP + 32;
        }
        ELSE IF (TEMP >= 'A' && TEMP <= 'Z') // 小写转大写
        {
            TEMP = TEMP - 32;
        }

        WRITE(FB, &TEMP, FLAG);
    }

    CLOSE(FD);
    CLOSE(FB);

    RETURN 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes 学习记录

https://note.youdao.com/ynoteshare/index.html?idbc7bee305611b52d6900ba209a92bd4d&typenote&_time1694072007342 概览 K8S官网文档&#xff1a;https://kubernetes.io/zh/docs/home/ K8S 是Kubernetes的全称&#xff0c;源于希腊语&#xff0c;意为“舵手”或“…

接口自动化中对于文件上传的处理方法

正常的接口自动化基本都是json的格式&#xff0c;对于文件上传是一种特殊的格式是表单格式针对这种表单格式在接口自动化中怎么处理&#xff0c;主要通过工作中使用的一个实际的例子进行分享 举例&#xff1a;web上需要导入一个文件实现相关的功能&#xff0c;主要通过两个接口…

oracle表、表空间使用空间

文章目录 一、Oracle查询表空间占用情况二、Oracle查询表占用的空间三、Oracle查询表空间使用情况四、Oracle查询每张表占用空间五、表空间大小 TOC 一、Oracle查询表空间占用情况 oracle日常工作中查看表占用空间大小是数据库管理中的基本操作&#xff1a; SELECT a.tablesp…

nginx续1:

八、虚拟主机配置 基于域名的虚拟主机 [rootserver2 ~]# ps -au|grep nginx //查看进程 修改Nginx服务配置&#xff0c;添加相关虚拟主机配置如下 1. [rootproxy ~]# vim /usr/local/nginx/conf/nginx.conf 2. .. .. 3. server { 4. listen …

【SuperMap iServer 服务列表未授权访问漏洞】怎么处理

今天遇到这样一个安全问题需要处理&#xff1a; 漏洞名称&#xff1a; 接口未授权访问。 漏洞URL&#xff1a; https://****/iserver/services 漏洞描述&#xff1a; 多个服务存在未授权访问&#xff0c;可访问清除缓存等功能。 查阅官方社区发现有两个解决办法&#xff1…

在 Vim 编辑器中,如果某个单词被意外地高亮显示,使用:noh可以取消高亮显示

文章目录 1、问题出现的背景2、解决办法 1、问题出现的背景 配置镜像加速器&#xff0c;修改 /etc/docker/daemon.json 目录下的文件&#xff0c;不小心高亮显示https&#xff0c;产生问题的步骤是&#xff0c;我先是按esc键退出vim的编辑模式&#xff0c;然后在https的前面按…

《计算机应用文摘》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《计算机应用文摘》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是维普收录的正规学术期刊。 问&#xff1a;《计算机应用文摘》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;重庆西南信息有限公司 主办单位&#x…

需求跟踪矩阵:项目管理的“指南针”

前言 在项目的茫茫大海中&#xff0c;需求如同潮汐般汹涌澎湃&#xff0c;而我们则是那驾船的舵手&#xff0c;需要在波涛汹涌中找到正确的航向。如何确保每一个需求都能得到满足&#xff0c;同时又不偏离项目的主线&#xff1f;这就需要我们借助一种强大的工具——需求跟踪矩…

springboot超市商品管理系统-计算机毕业设计源码55289

摘 要 随着信息技术的快速发展和普及&#xff0c;传统的超市管理模式已经无法满足现代商业的需求。为了提高超市的管理效率&#xff0c;优化商品销售流程&#xff0c;本文提出了一种基于SpringBoot框架的超市商品管理系统。该系统结合了现代软件开发技术&#xff0c;包括MySQL数…

【策略工厂模式】记录策略工厂模式简单实现

策略工厂模式 1. 需求背景2. 代码实现2.1 定义基类接口2.2 排序策略接口定义2.3 定义抽象类&#xff0c;实现策略接口2.4 具体的排序策略实现类2.5 实现策略工厂类2.6 控制类 3. 启动测试4. 总结 1. 需求背景 现在需要你创建一个策略工厂类&#xff0c;来根据策略实现各种排序…

第三周:网络应用(上)

一、网络应用&#xff08;层&#xff09;内容概述 我们已经知道&#xff0c;Internet的体系结构是符合TCP/IP协议栈的&#xff0c;而“应用层”就在这个协议的最上层。 本讲内容包括&#xff1a; 二、网络应用的基本原理 常见网络应用包括&#xff1a; 问&#xff1a;网络应…

【机器学习】正规方程的简单介绍以及如何使用Scikit-Learn实现基于正规方程的闭式解线性回归

引言 Scikit-learn 是一个开源的机器学习库&#xff0c;它支持 Python 编程语言。它提供了多种机器学习算法的实现&#xff0c;并用于数据挖掘和数据分析 文章目录 引言一、正规方程的定义二、正规方程的原理三、使用 Scikit-Learn 实现基于正规方程的闭式解线性回归3.1 工具3.…

如何使用rdma-core来实现RDMA操作

rdma-core 是一个开源项目&#xff0c;为远程直接内存访问&#xff08;RDMA&#xff09;提供用户空间的支持。它包括 RDMA 设备的驱动程序、库和工具&#xff0c;旨在简化 RDMA 应用的开发和部署。 基础知识参考博文&#xff1a; 一文带你了解什么是RDMA RDMA 高性能架构基本…

“论数据分片技术及其应用”写作框架软考高级论文系统架构设计师论文

论文真题 数据分片就是按照一定的规则&#xff0c;将数据集划分成相互独立、正交的数据子集&#xff0c;然后将数据子集分布到不同的节点上。通过设计合理的数据分片规则&#xff0c;可将系统中的数据分布在不同的物理数据库中&#xff0c;达到提升应用系统数据处理速度的目的…

快速入门 Spring Security

1 认证授权 认证&#xff08;Authentication&#xff09;&#xff1a;可以理解为登录&#xff0c;验证访问者的身份。包括用户名密码认证、手机号短信验证码认证、指纹识别认证、面容识别认证等等授权&#xff08;Authorization&#xff09;&#xff1a;授权发生在系统完成身份…

springboot校园商店配送系统-计算机毕业设计源码68448

摘要 本文详细阐述了基于Spring Boot框架的校园商店配送系统的设计与实现过程。该系统针对校园内的用户需求&#xff0c;整合了用户注册与登录、商品浏览与购买、订单管理、配送追踪、用户反馈收集以及后台管理等功能&#xff0c;为校园内的普通用户、商家、配送员和管理员提供…

用深度学习改进乳腺癌MRI诊断| 文献速递--AI辅助的放射影像疾病诊断

Title 题目 Improving breast cancer diagnostics with deep learning for MRI 用深度学习改进乳腺癌MRI诊断 01 文献速递介绍 乳腺磁共振成像&#xff08;MRI&#xff09;是一种检测乳腺癌的高度敏感的方式&#xff0c;报告的敏感性超过80%。传统上&#xff0c;其在筛查…

教程系列4 | 趋动云『社区项目』极速体验 LivePortrait 人脸表情“移花接木”大法

LivePortrait LivePortrait 由快手可灵大模型团队开源&#xff0c;只需 1 张原图就能生成动态视频。 LivePortrait 的核心优势在于其卓越的表情"迁移"技术&#xff0c;能够令静态图像中的人物瞬间焕发活力&#xff0c;无论是眨眼、微笑还是转头&#xff0c;皆栩栩如…

spaCy语言模型下载

spaCy 是一个基于 Python 编写的开源自然语言处理&#xff08;NLP&#xff09;库&#xff0c;它提供了一系列的工具和功能&#xff0c;用于文本预处理、文本解析、命名实体识别、词性标注、句法分析和文本分类等任务。 spaCy支持多种语言模型对文本进行处理&#xff0c;包括中文…

JAVA基础 - 异常处理

目录 一. 简介 二. 受检异常 三. 非受检异常 四. 自定义异常类 一. 简介 异常处理是 Java 编程中的一个重要概念&#xff0c;它用于处理程序运行时可能出现的不正常情况。 在 Java 中&#xff0c;异常可以分为两类&#xff1a;受检异常&#xff08;Checked Exception&…