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

【文件I/O】UNIX文件基础

IO编程的本质是通过 API 操作 文件。

什么是 IO
  • I - Input 输入
  • O - Output 输出

这里的输入和输出都是站在应用(运行中的程序)的角度。外部特指文件。

这里的文件是泛指,并不是只表示存在存盘中的常规文件。还有设备、套接字、管道、链接等等。在 Linux 系统中 “一切皆文件”,目的是为了统一接口,简化编程。简单点说:

输入/输出编程 :让你将输入/输出功能 作用在 文件 上 ----文件(7种)
---------------------> 对文件进行 IO 操作 ---->将某些代码数据 保留在 文件 上
好处:
1> 将某些代码数据 保留在 文件 上 -----> 关于这一点请查阅文章《将数据保留(文件持久化)》
2> 丰富你访问底层的手段
3> 可以通过代码打开一些特殊文件 (管道/套接字/字符设备等等)

文件是什么
	文件:操作系统中一种二进制/相关数据有序的集合文件名:这个数据集合的名称Linux---有哪些文件类型? 共计为 7大类-	普通文件:C程序/可执行文件d   目录     ---> 文件夹c 	字符设备  ---> 驱动使用b   块设备    ---> 驱动使用s 	套接字    ---> 网络编程使用p   管道      ---> 多进程线程使用l   软链接    ---> 快捷方式
标准 IO 和系统 IO

在这里插入图片描述
在这里插入图片描述
这里展示了三种内核访问方式:Shell 命令访问内核系统 API 访问内核C 库函数访问内核

1. Shell 命令访问内核

  • Shell 是操作系统的命令行接口,用户通过输入命令(如 ls、cat、cp 等)间接与内核交互。
  • Shell 命令通过调用操作系统提供的系统 API,与内核交互完成任务。例如,ls 命令通过调用系统 API 获取目录列表。

工作流程(结合图示)

  1. 用户输入 Shell 命令(如 ls)。
  2. Shell 将命令解释为系统调用,例如 open()、read() 等。
  3. 系统调用接口(API)将请求传递给操作系统内核。
  4. 内核通过驱动程序访问硬件设备(如磁盘),获取数据。
  5. 内核将数据返回给 Shell,Shell 将结果显示给用户。

适合直接操作文件或目录;用户无需编程即可操作内核(高层次封装);主要适合简单的文件管理操作,例如查看文件、复制文件等。

2. 系统 API 访问内核

  • 系统 API(如 open()、read()、write())是操作系统提供的接口,用于程序直接与内核交互。
  • 程序员通过调用这些 API,可以访问文件系统、硬件设备等底层资源。

工作流程(结合图示)

  1. 应用程序调用系统 API(例如 open() 打开文件、read() 读取文件内容、write() 写入文件)。
  2. 系统 API 调用操作系统的内核功能,完成对设备或文件的操作。
  3. 内核通过驱动程序与硬件设备交互(如读取磁盘数据)。
  4. 操作系统将结果返回给应用程序。

优势尤其明显:直接访问内核,开发者通过系统 API 与内核交互;并且提供了高效的文件操作能力,适合对性能要求较高的场景;比 Shell 命令更加灵活,但需要更丰富编程知识。

3. C 库函数访问内核(标准 I/O)

  • C 标准库(如 stdio.h 提供的函数 fopen()、fclose()、fwrite() 等)对系统 API 进行了封装,简化了文件操作。
  • 应用程序通过调用 C 库函数间接访问内核。例如,fopen() 实际上会调用系统 API open()。

工作流程(结合图示)

  1. 应用程序调用 C 标准库函数(如 fopen())。
  2. 标准库函数将调用转换为系统 API 调用(如从 fopen() 转换为 open())。
  3. 系统 API 通过内核与硬件设备交互(如文件读取、写入)。
  4. 内核将结果返回给标准库函数,应用程序通过标准库函数获取结果。

C 库函数访问内核实现了更高层次的封装:C 库函数将系统调用封装为易用的接口,简化了开发;具备跨平台性:C 标准库屏蔽了操作系统差异,程序更容易移植;适合一般开发:更方便、易于维护,但性能可能略低于直接使用系统 API。

  • Shell 命令层
    • 用户通过命令(如 ls)访问内核。
    • 图中未直接显示 Shell 命令路径,但 Shell 命令最终通过系统 API 调用内核。
  • 系统 API 层
    • 图中展示了系统 API,如 open()、read()、close() 等。
    • 应用程序直接调用这些 API,与内核交互。
  • C 库函数层
    • 标准 C 库(如 fopen())封装了底层 API 调用,提供了易用的接口。
    • 图中显示了 C 库函数调用系统 API 的过程(如 fopen() 调用 open())。
  • 内核和设备驱动层
    • 如图所示,内核通过驱动程序与硬件设备交互的过程(如文件存储在磁盘上,通过驱动读取数据)。
不同访问方式在代码上的差异:

Shell 命令访问
通过 Shell 命令直接操作文件,无需编写程序。用户通过命令行与内核交互。

示例:任务是读取文件内容并将其打印到屏幕。

# 创建一个文件并写入内容
echo "Hello, this is a test file." > test.txt# 通过 Shell 命令读取文件内容并打印
cat test.txt

输出:

Hello, this is a test file.
# 优点:简单、直接,无需编程。
# 缺点:灵活性差,无法嵌入复杂的逻辑。

系统 API 访问
通过操作系统提供的系统调用(如 open()、read())直接访问内核。

示例:使用 C 语言中的系统调用接口读取文件内容。

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>int main() {// 打开文件int fd = open("test.txt", O_RDONLY);if (fd < 0) {perror("Error opening file");return 1;}// 读取文件内容char buffer[1024];ssize_t bytes_read = read(fd, buffer, sizeof(buffer) - 1);if (bytes_read < 0) {perror("Error reading file");close(fd);return 1;}// 确保字符串以 '\0' 结尾buffer[bytes_read] = '\0';// 打印文件内容printf("File content:\n%s\n", buffer);// 关闭文件close(fd);return 0;
}

输出:

File content:
Hello, this is a test file.# 优点:
#   提供对文件操作的精细控制。
#   性能高,适合对系统资源的直接访问。
# 缺点:
#   开发复杂度较高,需要手动管理资源(如文件描述符的关闭等)。

C 库函数访问
通过 C 标准库函数(如 fopen()、fgets())封装系统调用,简化文件操作。

示例:使用 C 标准库函数实现文件读取。

#include <stdio.h>int main() {// 打开文件FILE *file = fopen("test.txt", "r");if (file == NULL) {perror("Error opening file");return 1;}// 读取文件内容并打印char buffer[1024];while (fgets(buffer, sizeof(buffer), file) != NULL) {printf("%s", buffer);}// 关闭文件fclose(file);return 0;
}

输出:

Hello, this is a test file.# 优点:
#   使用方便,屏蔽了底层系统调用的细节。
#   提供了一些高级功能(如缓冲)。
# 缺点:
#   性能略低于直接调用系统 API。
访问方式代码复杂度性能应用场景
Shell 命令访问较低简单的文件操作任务,如查看、编辑文件内容
系统 API 访问高(直接访问内核)性能要求高的场景,如大型文件读写或底层系统编程
C 库函数访问中(有缓冲优化)通用场景,如日志文件处理、常规文件读写

复杂场景三者的差别:
任务:将文件内容逐行读取,并将每行的长度打印出来。

  1. Shell 命令实现:
while read line; doecho "Length: ${#line}"
done < test.txt
  1. 系统 API 实现:
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>int main() {int fd = open("test.txt", O_RDONLY);if (fd < 0) {perror("Error opening file");return 1;}char buffer[1024];ssize_t bytes_read;while ((bytes_read = read(fd, buffer, sizeof(buffer) - 1)) > 0) {buffer[bytes_read] = '\0';char *line = strtok(buffer, "\n");while (line != NULL) {printf("Length: %ld\n", strlen(line));line = strtok(NULL, "\n");}}close(fd);return 0;
}
  1. C 库函数实现:
#include <stdio.h>
#include <string.h>int main() {FILE *file = fopen("test.txt", "r");if (file == NULL) {perror("Error opening file");return 1;}char buffer[1024];while (fgets(buffer, sizeof(buffer), file) != NULL) {buffer[strcspn(buffer, "\n")] = '\0';  // 去掉换行符printf("Length: %ld\n", strlen(buffer));}fclose(file);return 0;
}

在实际开发中,根据任务复杂度和性能需求选择合适的访问方式即可。例如:

  • 简单任务:用 Shell 命令。
  • 高性能需求:用系统 API。
  • 通用场景:用 C 标准库函数。
系统调用(文件IO)

省流版(简单理解):文件IO更贴切底层,有系统地方就有文件IO

	用户空间进程访问内核的接口 把用户从底层的硬件编程中解放出来 极大的提高了系统的安全性 使用户程序具有可移植性 是操作系统的一部分 

系统调用接口是内核的组成部分,不管你是否调用这些接口,它都存在于内核中。调用它时不需要加载,直接跳转执行。

库函数(标准IO)

省流版(简单理解):标准IO更依赖封装的C库函数库,应用面相对没有文件IO

	库函数为了实现某个功能而封装起来的API集合提供统一的编程接口,更加便于应用程序的移植是语言或者应用程序的一部

库函数是应用的一部分,调用它时需要加载到进行中,然后才跳转执行,程序结束时会卸载。

访问区别:
1> 文件指针 ---> FILE *  --->文件流/流指针FILE ---> 是一个结构体别名FILE:利用拥有的成员都属于系统底层成员//stdio.htypedef struct _iobuf{char*  _ptr;        //文件输入的下一个位置int    _cnt;        //当前缓冲区的相对位置char*  _base;       //文件初始位置int    _flag;       //文件标志 int    _file;       //文件有效性    ------**** 文件管理块 FCBint    _charbuf;    //缓冲区是否可读取int    _bufsiz;     //缓冲区字节数char*  _tmpfname;   //临时文件名} FILE;2> 文件描述符 ----- *:贯穿了整个应用层顺序分配的非负整数内核用以标识一个特定进程正在访问的文件其他资源(socket、pipe等)的访问标识系统调用(系统IO)使用 "文件描述符" 来唯一标识进程所打开的文件(包含常规文件、目录、块设备文件、字符设备文件、管道、符号链接、套接字等)。
FILE 流

使用非负整数表示(0,1,2,…),类型为 int。
每个 shell(进程)默认会打开三个文件描述符:标准输入/标准输出/标准错误输出

  1. STDIN_FILENO - 0 - 标准输入
  2. STDOUT_FILENO - 1- 标准输出
  3. STDERR_FILENO - 2 - 标准出错

以上三个文件描述符在进程中可以直接使用,无须额外打开。另外,这三个标准文件很特殊 —> 既是已存在的文件,也是文件指针同时还是文件描述符。

每个 shell(进程)默认打开的三个文件描述符所对应的 FILE 流:文件指针		文件描述符标准输入      	stdin 			0标准输出      	stdout			1 标准错误输出   	stderr          2在 /usr/include/stdio.h 头文件中声明了以下全局流:/* Standard streams.  */extern struct _IO_FILE *stdin;          /* Standard input stream.  */extern struct _IO_FILE *stdout;         /* Standard output stream.  */extern struct _IO_FILE *stderr;         /* Standard error output stream.  *//* C89/C99 say they're macros.  Make them happy.  */#define stdin stdin#define stdout stdout#define stderr stderr

文件io
其他情况下:文件指针 和 文件描述符 操作 则是完全独立的。

  • 文件指针:标准IO
  • 文件描述符:文件IO
  • 文件I/O —> 不用缓存的I/O
    • 通过文件描述符进行访问:open()/read()/write()/lseek()/close()…
  • 标准I/O
    • 通过 FILE* 进行访问:printf()/fprintf()/fopen()/fread()/fwrite()/fseek()/fclose()…
出错处理

/usr/include/errno.h 中定义了错误代码。

#include <errno.h>

真正定义这些错误代码的文件是:/usr/include/asm-generic/errno-base.h

/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ASM_GENERIC_ERRNO_BASE_H
#define _ASM_GENERIC_ERRNO_BASE_H#define EPERM            1      /* Operation not permitted */
#define ENOENT           2      /* No such file or directory */
#define ESRCH            3      /* No such process */
#define EINTR            4      /* Interrupted system call */
#define EIO              5      /* I/O error */
#define ENXIO            6      /* No such device or address */
#define E2BIG            7      /* Argument list too long */
#define ENOEXEC          8      /* Exec format error */
#define EBADF            9      /* Bad file number */
#define ECHILD          10      /* No child processes */
#define EAGAIN          11      /* Try again */
#define ENOMEM          12      /* Out of memory */
#define EACCES          13      /* Permission denied */
#define EFAULT          14      /* Bad address */
#define ENOTBLK         15      /* Block device required */
#define EBUSY           16      /* Device or resource busy */
#define EEXIST          17      /* File exists */
#define EXDEV           18      /* Cross-device link */
#define ENODEV          19      /* No such device */
#define ENOTDIR         20      /* Not a directory */
#define EISDIR          21      /* Is a directory */
#define EINVAL          22      /* Invalid argument */
#define ENFILE          23      /* File table overflow */
#define EMFILE          24      /* Too many open files */
#define ENOTTY          25      /* Not a typewriter */
#define ETXTBSY         26      /* Text file busy */
#define EFBIG           27      /* File too large */
#define ENOSPC          28      /* No space left on device */
#define ESPIPE          29      /* Illegal seek */
#define EROFS           30      /* Read-only file system */
#define EMLINK          31      /* Too many links */
#define EPIPE           32      /* Broken pipe */
#define EDOM            33      /* Math argument out of domain of func */
#define ERANGE          34      /* Math result not representable */#endif

另外还有一个文件:/usr/include/asm-generic/errno.h

/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ASM_GENERIC_ERRNO_H
#define _ASM_GENERIC_ERRNO_H#include <asm-generic/errno-base.h>#define EDEADLK         35      /* Resource deadlock would occur */
#define ENAMETOOLONG    36      /* File name too long */
#define ENOLCK          37      /* No record locks available *//** This error code is special: arch syscall entry code will return* -ENOSYS if users try to call a syscall that doesn't exist.  To keep* failures of syscalls that really do exist distinguishable from* failures due to attempts to use a nonexistent syscall, syscall* implementations should refrain from returning -ENOSYS.*/
#define ENOSYS          38      /* Invalid system call number */#define ENOTEMPTY       39      /* Directory not empty */
#define ELOOP           40      /* Too many symbolic links encountered */
#define EWOULDBLOCK     EAGAIN  /* Operation would block */
#define ENOMSG          42      /* No message of desired type */
#define EIDRM           43      /* Identifier removed */
#define ECHRNG          44      /* Channel number out of range */
#define EL2NSYNC        45      /* Level 2 not synchronized */
#define EL3HLT          46      /* Level 3 halted */
#define EL3RST          47      /* Level 3 reset */
#define ELNRNG          48      /* Link number out of range */
#define EUNATCH         49      /* Protocol driver not attached */
#define ENOCSI          50      /* No CSI structure available */
#define EL2HLT          51      /* Level 2 halted */
#define EBADE           52      /* Invalid exchange */
#define EBADR           53      /* Invalid request descriptor */
#define EXFULL          54      /* Exchange full */
#define ENOANO          55      /* No anode */
#define EBADRQC         56      /* Invalid request code */
#define EBADSLT         57      /* Invalid slot */#define EDEADLOCK       EDEADLK#define EBFONT          59      /* Bad font file format */
#define ENOSTR          60      /* Device not a stream */
#define ENODATA         61      /* No data available */
#define ETIME           62      /* Timer expired */
#define ENOSR           63      /* Out of streams resources */
#define ENONET          64      /* Machine is not on the network */
#define ENOPKG          65      /* Package not installed */
#define EREMOTE         66      /* Object is remote */
#define ENOLINK         67      /* Link has been severed */
#define EADV            68      /* Advertise error */
#define ESRMNT          69      /* Srmount error */
#define ECOMM           70      /* Communication error on send */
#define EPROTO          71      /* Protocol error */
#define EMULTIHOP       72      /* Multihop attempted */
#define EDOTDOT         73      /* RFS specific error */
#define EBADMSG         74      /* Not a data message */
#define EOVERFLOW       75      /* Value too large for defined data type */
#define ENOTUNIQ        76      /* Name not unique on network */
#define EBADFD          77      /* File descriptor in bad state */
#define EREMCHG         78      /* Remote address changed */
#define ELIBACC         79      /* Can not access a needed shared library */
#define ELIBBAD         80      /* Accessing a corrupted shared library */
#define ELIBSCN         81      /* .lib section in a.out corrupted */
#define ELIBMAX         82      /* Attempting to link in too many shared libraries */
#define ELIBEXEC        83      /* Cannot exec a shared library directly */
#define EILSEQ          84      /* Illegal byte sequence */
#define ERESTART        85      /* Interrupted system call should be restarted */
#define ESTRPIPE        86      /* Streams pipe error */
#define EUSERS          87      /* Too many users */
#define ENOTSOCK        88      /* Socket operation on non-socket */
#define EDESTADDRREQ    89      /* Destination address required */
#define EMSGSIZE        90      /* Message too long */
#define EPROTOTYPE      91      /* Protocol wrong type for socket */
#define ENOPROTOOPT     92      /* Protocol not available */
#define EPROTONOSUPPORT 93      /* Protocol not supported */
#define ESOCKTNOSUPPORT 94      /* Socket type not supported */
#define EOPNOTSUPP      95      /* Operation not supported on transport endpoint */
#define EPFNOSUPPORT    96      /* Protocol family not supported */
#define EAFNOSUPPORT    97      /* Address family not supported by protocol */
#define EADDRINUSE      98      /* Address already in use */
#define EADDRNOTAVAIL   99      /* Cannot assign requested address */
#define ENETDOWN        100     /* Network is down */
#define ENETUNREACH     101     /* Network is unreachable */
#define ENETRESET       102     /* Network dropped connection because of reset */
#define ECONNABORTED    103     /* Software caused connection abort */
#define ECONNRESET      104     /* Connection reset by peer */
#define ENOBUFS         105     /* No buffer space available */
#define EISCONN         106     /* Transport endpoint is already connected */
#define ENOTCONN        107     /* Transport endpoint is not connected */
#define ESHUTDOWN       108     /* Cannot send after transport endpoint shutdown */
#define ETOOMANYREFS    109     /* Too many references: cannot splice */
#define ETIMEDOUT       110     /* Connection timed out */
#define ECONNREFUSED    111     /* Connection refused */
#define EHOSTDOWN       112     /* Host is down */
#define EHOSTUNREACH    113     /* No route to host */
#define EALREADY        114     /* Operation already in progress */
#define EINPROGRESS     115     /* Operation now in progress */
#define ESTALE          116     /* Stale file handle */
#define EUCLEAN         117     /* Structure needs cleaning */
#define ENOTNAM         118     /* Not a XENIX named type file */
#define ENAVAIL         119     /* No XENIX semaphores available */
#define EISNAM          120     /* Is a named type file */
#define EREMOTEIO       121     /* Remote I/O error */
#define EDQUOT          122     /* Quota exceeded */#define ENOMEDIUM       123     /* No medium found */
#define EMEDIUMTYPE     124     /* Wrong medium type */
#define ECANCELED       125     /* Operation Canceled */
#define ENOKEY          126     /* Required key not available */
#define EKEYEXPIRED     127     /* Key has expired */
#define EKEYREVOKED     128     /* Key has been revoked */
#define EKEYREJECTED    129     /* Key was rejected by service *//* for robust mutexes */
#define EOWNERDEAD      130     /* Owner died */
#define ENOTRECOVERABLE 131     /* State not recoverable */#define ERFKILL         132     /* Operation not possible due to RF-kill */#define EHWPOISON       133     /* Memory page has hardware error */#endif
全局错误码errno
      在errno.h中定义,全局可见错误值定义为“EXXX”形式,如EACCESS想阅读全局错误码: 1> /usr/include/asm-generic/errno-base.h 2> /usr/include/asm-generic/errno.h 处理规则如果没有出错,则 errno 值不会被一个例程清除,即只有出错时,才需要检查 errno 值任何函数都不会将 errno 值设置为 0,errno.h 中定义了所有常数都不为 0错误信息输出strerror() - 映射errno对应的错误信息  ---> 有:BUG:有的人Linux能用,有的人不能用;而且只会告诉你错了什么,但不会告诉你具体哪里错了。perror() – 输出用户信息及errno对应的错误信息		      		
if(??==错误返回){perror("自定义错误标志");return;
}
例如: 
int temp=scanf("%d",&a); //一定要注意:scanf的错误返回,你一定要知道
if(temp==0){perror("嘿嘿,此处报错咯~");
}

strerror 函数

#include <string.h>
char *strerror(int errnum);// 将 errnum 翻译为对应错误的解释字符串,并返回字符串指针
// 当传递无效错误号 nnn 时返回 Unknown error nnn

perror 函数

#include <stdio.h>
void perror(const char *s);// 将 s 后加一个 : 号加空格(即 ": "),并且将 errno 对应的描述字符串连接在后面,打印输出

示例代码:

#include <errno.h>
#include <string.h>
#include <stdio.h>int main(void)
{FILE *fp;// 打印 EINVAL 错误号对应的错误描述printf("EINVAL - %s\n", strerror(EINVAL));// 打印无效的错误号 150 对应的描述printf("150 - %s\n", strerror(150));// 以只读的方式打开 ./abc.txt,如果文件不存在则会打开失败fp = fopen("./abc.txt", "r");// 直接打印当前 errno 的值所对应的描述printf("errno = %d, %s\n", errno, strerror(errno));if (!fp) {// 打印错误描述(常用)perror("打开文件 ./abc.txt 失败");return -1;}// 关闭文件流fclose(fp);return 0;
}

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

相关文章:

【文件I/O】UNIX文件基础

IO编程的本质是通过 API 操作 文件。 什么是 IO I - Input 输入O - Output 输出 这里的输入和输出都是站在应用&#xff08;运行中的程序&#xff09;的角度。外部特指文件。 这里的文件是泛指&#xff0c;并不是只表示存在存盘中的常规文件。还有设备、套接字、管道、链接…...

TensorFlow Quantum快速编程(高级篇)

五、实战:量子分类器应用 5.1 数据准备 在实战构建量子分类器时,数据准备是基石环节。选用鸢尾花数据集,这一经典数据集在机器学习领域应用广泛,其涵盖了三种鸢尾花品种的样本,每个样本包含花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征。鉴于本次构建二分类量子分类…...

无人机+无人车:车机协同技术探索详解

无人机与无人车之间的协同技术是一种重要的研究方向&#xff0c;它结合了无人机的高空视野和无人车的地面移动能力&#xff0c;旨在实现更高效、灵活的作业。以下是对无人机与无人车车机协同技术的详细探索&#xff1a; 一、技术基础 1. 通信机制&#xff1a; 无人机与无人车…...

解决WordPress出现Fatal error: Uncaught TypeError: ftp_nlist()致命问题

错误背景 WordPress版本&#xff1a;wordpress-6.6.2-zh_CN WooCommerce版本&#xff1a;woocommerce.9.5.1 WordPress在安装了WooCommerce插件后&#xff0c;安装的过程中没有问题&#xff0c;在安装完成后提示&#xff1a; 此站点遇到了致命错误&#xff0c;请查看您站点管理…...

scrapy爬取图片

scrapy 爬取图片 环境准备 python3.10scrapy pillowpycharm 简要介绍scrapy Scrapy 是一个开源的 Python 爬虫框架&#xff0c;专为爬取网页数据和进行 Web 抓取而设计。它的主要特点包括&#xff1a; 高效的抓取性能&#xff1a;Scrapy 采用了异步机制&#xff0c;能够高效…...

【数据库】六、数据库设计

文章目录 六、数据库设计1 数据库设计步骤1.1 规划阶段1.2 需求分析1.3 概念设计阶段(重点)1.4 逻辑设计阶段(重点)1.5 物理设计阶段1.6 数据库的实现1.7 数据库运行与维护 2 概念模型设计2.1 ER模型2.1.1 ER模型的基本元素2.1.2 联系的设计2.1.3 采用ER模型的概念设计2.1.4 ER…...

错误的类文件: *** 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中

一、问题 用maven对一个开源项目打包时&#xff0c;遇到了“错误的类文件: *** 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。”&#xff1a; 二、原因 原因是当前java环境是Java 8&#xff08;版本52.0&#xff09;&#xff0c;但…...

不同音频振幅dBFS计算方法

1. 振幅的基本概念 振幅是描述音频信号强度的一个重要参数。它通常表示为信号的幅度值&#xff0c;幅度越大&#xff0c;声音听起来就越响。为了更好地理解和处理音频信号&#xff0c;通常会将振幅转换为分贝&#xff08;dB&#xff09;单位。分贝是一个对数单位&#xff0c;能…...

《探秘开源多模态神经网络模型:AI 新时代的万能钥匙》

《探秘开源多模态神经网络模型&#xff1a;AI 新时代的万能钥匙》 一、多模态模型的崛起之路&#xff08;一&#xff09;从单一到多元&#xff1a;模态的融合演进&#xff08;二&#xff09;关键技术突破&#xff1a;解锁多模态潜能 二、开源多模态模型深度剖析&#xff08;一&…...

计算机网络之---端口与套接字

总括 端口&#xff1a;是计算机上用于标识网络服务的数字标识符&#xff0c;用于区分不同的服务或应用程序。套接字&#xff1a;是操作系统提供的用于进程间网络通信的编程接口&#xff0c;允许程序通过它来进行数据的发送、接收和连接管理。关系&#xff1a;端口号用于标识服…...

el-tabs中tabs过多造成form表单输入的时候卡顿

这里写自定义目录标题 tabs过多造成的输入卡顿解决方案方案一方案二 出现的并发问题解决方案 tabs过多造成的输入卡顿 描述&#xff1a;前端要写一个需求&#xff0c;大概有一百多个tab渲染过来&#xff0c;每个tab中都是一个表单&#xff0c;这个时候数据渲染任务加重&#x…...

vue+vite打包空白问题

在使用vuevite创建项目之后如果我们在部署项目的时候使用的不是主域名 比如www.custom.com 而是使用了www.custom.com/test 为访问域名的时候 如果不小心没有注意到这个变化 在打包上线之后会出现页面空白 js或者css404问题 我们可以在vite.config.ts去配置路径base export de…...

【python翻译软件V1.0】

如果不想使用密钥的形式&#xff0c;且需要一个直接可用的中英文翻译功能&#xff0c;可以使用一些免费的公共 API&#xff0c;如 opencc 或其他无需密钥的库&#xff0c;或直接用 requests 获取翻译结果。 其中&#xff0c;我可以给你一个简单的代码示例&#xff0c;使用 tra…...

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环应用)

实战训练1—求最大公约数 问题描述&#xff1a; 给定两个正整数&#xff0c;求它们的最大公约数。 输入格式&#xff1a; 输入一行&#xff0c;包含两个正整数。 输出格式&#xff1a; 输出一行&#xff0c;包含gcd正整数&#xff0c;即这两个正整数的最大公约数。 输入…...

HTTPS协议的基础与工作原理

什么是HTTPS&#xff1f; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是HTTP协议的安全版本&#xff0c;它通过SSL/TLS协议对通信数据进行加密&#xff0c;确保数据的安全传输。与HTTP相比&#xff0c;HTTPS能防止数据被窃取、篡改或伪造&#xff0c;广…...

手游业务该如何选择服务器?

在网络游戏行业当中&#xff0c;对于服务器配置的需求是非常高的&#xff0c;大型的网络游戏需要服务器的高稳定性&#xff0c;来保证用户的游戏体验感&#xff0c;那么对于手游业务来说该如何进行选择服务器呢&#xff1f; 手游业务通常都需要处理大量的用户数据信息和并发请求…...

Python 数据建模完整流程指南

在数据科学和机器学习中&#xff0c;建模是一个至关重要的过程。通过有效的数据建模&#xff0c;我们能够从原始数据中提取有用的洞察&#xff0c;并为预测或分类任务提供支持。在本篇博客中&#xff0c;我们将通过 Python 展示数据建模的完整流程&#xff0c;包括数据准备、建…...

java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

今天在朋友机子上运行代码&#xff0c;在生成token的时候&#xff0c;遇到了这样一个问题&#xff1a; Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter at io.jsonwebtoken.impl.Base64Codec.decode(Base64Codec.java:26) ~[jjwt-0.9.1.jar:0.…...

12. C语言 数组与指针(深入理解)

本章目录: 前言1. 什么是数组&#xff1f;2. 数组的声明与初始化声明数组初始化数组 3. 访问数组元素遍历数组 4. 获取数组长度使用 sizeof 获取长度使用宏定义简化 5. 数组与指针数组名与指针的区别使用指针操作数组 6. 多维数组遍历多维数组 7. 数组作为函数参数8. 高级技巧与…...

C#用直线和曲线抗锯齿

使用 GDI 绘制一条线时&#xff0c;要提供线条的起点和终点&#xff0c;但不必提供有关线条上各个像素的任何信息。 GDI 与显示驱动程序软件协同工作&#xff0c;确定将打开哪些像素以在特定显示设备上显示该线条。 效果对比 代码实现 关键代码 e.Graphics.SmoothingMode Sm…...

从SS到CSS:探索网页样式设计的奥秘

一、什么是CSS CSS&#xff0c;全称为层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;是一种用于描述HTML&#xff08;超文本标记语言&#xff09;或XML&#xff08;包括如SVG、MathML等各种XML方言&#xff09;文档样式的样式表语言。 从结构和功能的…...

[Git] git reset --hard / git reset --soft

git reset --hard 功能&#xff1a;重置索引&#xff08;暂存区&#xff09;和工作目录到指定的提交状态。这意味着它会丢弃所有未提交的更改和已暂存的更改。 适用场景&#xff1a;当你想要完全放弃当前工作目录中的所有更改并回退到某个特定提交状态时&#xff0c;可以使用这…...

OIDC IdentityServer4》》授权码模式+刷新令牌

认证服务 new Client {ProtocolType "oidc",ClientName "测试",ClientId "zen",//定义客户端 Id 要唯一ClientSecrets { new Secret("abc123zenabres89jijkomnlj".Sha256()) },//Client用来获取token// 混合模式AllowedGrantTyp…...

Sql 创建用户

Sql server 创建用户 Sql server 创建用户SQL MI 创建用户修改其他用户密码 Sql server 创建用户 在对应的数据库执行&#xff0c;该用户得到该库的所有权限 test.database.chinacloudapi.cn DB–01 DB–02 创建服务器登录用户 CREATE LOGIN test WITH PASSWORD zDgXI7rsafkak…...

vscode开启调试模式,结合Delve调试器调试golang项目详细步骤

1.前期准备 (1).在vs code中的扩展程序中搜索并安装Go扩展程序 (2).安装 Delve 调试器 go install github.com/go-delve/delve/cmd/dlvlatest (3).打开vs code的命令面板&#xff0c;输入Go: Install/Update Tools&#xff0c;并单击该命令执行&#xff0c;安装或更新Go语…...

搭建Hadoop分布式集群

软件和操作系统版本 Hadoop框架是采用Java语言编写&#xff0c;需要java环境&#xff08;jvm&#xff09; JDK版本&#xff1a;JDK8版本 &#xff0c;本次使用的是 Java: jdk-8u431-linux-x64.tar.gz Hadoop: hadoop-3.3.6.tar.gz 三台Linux虚拟节点: CentOS-7-x86_64-DVD-2…...

网络安全应急响应技术原理与应用

网络安全应急响应概述 “居安思危&#xff0c;思则有备&#xff0c;有备无患。”网络安全应急响应是针对潜在发生的网络安全事件而采取的网络安全措施。本节主要阐述网络安全响应的概念、网络安全应急响应的发展、网络安全应急响应的相关要求。 17.1.1 网络安全应急响应概念 网…...

01 Oracle自学环境搭建

1 Oracle12C安装 1.1 下载 官网地址&#xff1a;https://www.oracle.com/ 解压安装包 运行安装程序 1.2 安装 配置安全更新 软件更新 安装选项 系统类 Oracle主目录用户选择 使用现有windows用户&#xff1a;如果选择该项&#xff0c;则需要指定没有管理权限的用户。 创建新Wi…...

MYSQL----------MySQL权限管理

1 MySQL权限管理 .1.1 权限系统的工作原理 查看用户权限 -- 查看用户的权限 SHOW GRANTS FOR usernamelocalhost;解释&#xff1a;这条SQL语句用于查看指定用户在本地主机上的权限。其中username是要查看权限的用户。 .1.2 权限表的存取 查询权限表&#xff08;以user表为例&a…...

学习HLS.js

前言 HTTP 实时流&#xff08;也称为HLS&#xff08;.m3u8&#xff09;&#xff09;是一种基于HTTP的自适应比特率流通信协议。HLS.js依靠HTML5视频和MediaSource Extensions进行播放&#xff0c;其特点&#xff1a;视频点播和直播播放列表、碎片化的 MP4 容器、加密媒体扩展 …...

Zustand selector 发生 infinate loops的原因以及解决

Zustand selector 发生 infinate loops 做zustand tutorial project的时候&#xff0c;使用选择器方法引入store&#xff0c;出现Maximum update depth exceeded,也就是组件一直重新渲染&#xff0c;改成直接使用store就没有不会出现这个问题。如下&#xff1a; // const [xIs…...

Unity自定义编辑器:基于枚举类型动态显示属性

1.参考链接 2.应用 target并设置多选编辑 添加[CanEditMultipleObjects] using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;[CustomEditor(typeof(LightsState))] [CanEditMultipleObjects] public class TestInspector :…...

donet (MVC)webAPI 的接受json 的操作

直接用对象来进行接收&#xff0c;这个方法还不错的。 public class BangdingWeiguiJiluController : ApiController{/// <summary>/// Json数据录入错误信息/// </summary>/// <param name"WeiguiInfos"></param>/// <returns></r…...

GitHub 新手入门指南

一、GitHub 简介 GitHub 是全球最大的代码托管平台&#xff0c;它基于 Git 版本控制系统&#xff0c;为开发者提供了一个集中存储、管理和协作开发代码的空间。在这里&#xff0c;你可以找到无数开源项目&#xff0c;也可以将自己的项目与全球开发者社区共享&#xff0c;促进知…...

Django后端相应类设计

通用的ApiResponse类&#xff1a;用于生成统一的 API 响应格式。每个响应都包含以下字段&#xff08;每个接口最终的返回数据格式&#xff09;&#xff1a; status_code&#xff1a;HTTP 状态码&#xff08;如 200、400、500 等&#xff09;message&#xff1a;响应的描述信息…...

完美解决VMware 17.0 Pro安装ubuntu、Deepin等虚拟机后卡顿、卡死问题

这两天在 VM 17 Pro 中安装了ubuntu 24.1 和Deepin 23.9 等Linux操作系统&#xff0c;在使用过程中出现过数次卡顿、卡死问题&#xff0c;现记录整理解决方法如下&#xff1a; 一、问题描述 安装虚拟机时、以及安装完成后正常使用时出现鼠标点击卡顿、系统反应慢、卡死等问题…...

前端 图片上鼠标画矩形框,标注文字,任意删除

效果&#xff1a; 页面描述&#xff1a; 对给定的几张图片&#xff0c;每张能用鼠标在图上画框&#xff0c;标注相关文字&#xff0c;框的颜色和文字内容能自定义改变&#xff0c;能删除任意画过的框。 实现思路&#xff1a; 1、对给定的这几张图片&#xff0c;用分页器绑定…...

【Oracle篇】深入了解执行计划中的访问路径(含表级别、B树索引、位图索引、簇表四大类访问路径)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;从事IT领域✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(…...

ROS2+OpenCV综合应用--11. AprilTag标签码跟随

1. 简介 apriltag标签码追踪是在apriltag标签码识别的基础上&#xff0c;增加了小车车体运动的功能&#xff0c;控制车体从而使摄像头会保持标签码在视觉中间左右运动&#xff0c;在根据物体在摄像头成像近大远小的原理根据这一特性&#xff0c;从而实现标签码跟随功能。 2. 启…...

第四、五章图论和网络爬虫+网络搜索

第四章 图论和网络爬虫 4.1 构建网络爬虫工程重点 构建网络爬虫的重点 用BFS还是DFS 在不考虑时间的情况下&#xff0c;这两种不同的搜索方法都可以在相同的时间下爬下整个静态的互联网内容&#xff0c;但是在现实中肯定是需要考虑时间以及互联网动态变化的。所以重点应该是如…...

PyMysql 01|(包含超详细项目实战)连接数据库、增删改查、异常捕获

目录 一、数据库操作应用场景 二、安装PyMysql 三、事务的概念 四、数据库的准备 五、PyMysql连接数据库 1、建立连接方法 2、入门案例 六、PyMysql操作数据库 1、数据库查询 1️⃣查询操作流程 2️⃣cursor游标 ​3️⃣查询常用方法 4️⃣案例 5️⃣异常捕获 …...

(No space left on device )

错误日志&#xff1a; org.springframe tipart.MultipartException: Failed to parse multipart servlet request: nested excepti /ROOT/upload_e5046403_6cd4_4673_3313_479fb76773fe_00000004.tmp (No space left on device ) 分析&#xff1a; (No space left on devi…...

Conmi的正确答案——Cordova使用“src-cordova/config.xml”编辑“Android平台”的“uses-permission”

Cordova版本&#xff1a;12.0.0 (cordova-lib12.0.1) 1、配置例程&#xff1a; <platform name"android"><config-file target"AndroidManifest.xml" parent"/manifest"><uses-permission android:name"android.permission…...

LLaMA-Factory web微调大模型并导出大模型

LLaMA-Factory 开源大模型如LLaMA&#xff0c;Qwen&#xff0c;Baichuan等主要都是使用通用数据进行训练而来&#xff0c;其对于不同下游的使用场景和垂直领域的效果有待进一步提升&#xff0c;衍生出了微调训练相关的需求&#xff0c;包含预训练&#xff08;pt&#xff09;&am…...

针对数据库系统安全的漏洞扫描加固工具【WebSocket + MySQL】

一、系统背景 随着信息技术的迅猛发展和互联网的普及&#xff0c;数据库作为存储、管理和检索大量数据的关键组件&#xff0c;其安全性对于企业和组织来说至关重要。然而&#xff0c;由于网络环境的复杂性和攻击手段的多样性&#xff0c;数据库面临着越来越多的安全威胁&#…...

汽车基础软件AutoSAR自学攻略(三)-AutoSAR CP分层架构(2)

汽车基础软件AutoSAR自学攻略(三)-AutoSAR CP分层架构(2) 下面我们继续来介绍AutoSAR CP分层架构&#xff0c;下面的文字和图来自AutoSAR官网目前最新的标准R24-11的分层架构手册。该手册详细讲解了AutoSAR分层架构的设计&#xff0c;下面让我们来一起学习一下。 Introductio…...

《PC 上的开源神经网络多模态模型:开启智能交互新时代》

《PC 上的开源神经网络多模态模型&#xff1a;开启智能交互新时代》 一、引言二、多模态模型基础剖析&#xff08;一&#xff09;核心概念解读&#xff08;二&#xff09;技术架构探秘 三、开源多模态模型的独特魅力&#xff08;一&#xff09;开源优势尽显&#xff08;二&…...

Docker Desktop 构建java8基础镜像jdk安装配置失效解决

Docker Desktop 构建java8基础镜像jdk安装配置失效解决 文章目录 1.问题2.解决方法3.总结 1.问题 之前的好几篇文章中分享了在Linux(centOs上)和windows10上使用docker和docker Desktop环境构建java8的最小jre基础镜像&#xff0c;前几天我使用Docker Desktop环境重新构建了一个…...

【算法】八大排序算法

这篇文章是对数据结构中 八大经典排序算法 的详解&#xff0c;包括其原理、实现过程、时间复杂度、空间复杂度及其适用场景。最后两种排序不常见&#xff0c;但仍收录了进来保持文章结构的完整性。 排序(Sort)是将无序的记录序列&#xff08;或称文件&#xff09;调整成有序的…...

pytest+allure 入门

使用allure如何生成自动化测试报​​​​​​告 &#xff1f;一文详解allure的使用 。_allure测试报告-CSDN博客 例子&#xff1a; import allure import pytest import osallure.epic("闹钟") allure.feature("闹钟增删") class TestSchedule():def setu…...