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

36. 【Java教程】输入输出流

本小节将会介绍基本输入输出的 Java 标准类,通过本小节的学习,你将了解到什么是输入和输入什么是流;输入输出流的应用场景,File类的使用,什么是文件,Java 提供的输入输出流相关 API 等内容。

1. 什么是输入和输出(I / O)

1.1 基本概念

输入/输出这个概念,对于计算机相关专业的同学并不陌生,在计算中,输入/输出Input / Output,缩写为 I / O)是信息处理系统(例如计算机))与外界(可能是人类或其他信息处理系统)之间的通信。输入是系统接收的信号或数据,输出是从系统发送的信号或数据。

那么在 Java 中,什么是输入和输出呢?要理解这个概念,可将 Java 平台视作一个系统。Java 平台是一个孤立的系统,系统之外的所有东西都是它的环境。系统与其环境之间的交互是一种双向对话。系统要么从其环境接收消息,要么将其消息传递给环境。当系统接收到消息时,将其称为输入,与之相反的是输出。

本小节将介绍 Java 的基本输入和输出,包括从键盘读取文本输入,将文本输出到屏幕以及从文件系统读取/写入文件。

Java 提供了两个用于 I / O 的包:较旧的java.io包(不支持符号链接)和较新的java.nio(“new io”)包,它对java.nio.file的异常处理进行了改进。

1.2 简单的 Java 输出——打印内容到屏幕

一直以来,我们都在向屏幕输出内容以验证我们编写的代码逻辑。向屏幕输出内容非常简单,可以由以下两种方式来完成:

// 打印 Hello World,不换行
System.out.print("Hello World");
// 打印 Hello Java,并换行
System.out.println("Hello Java");

1.3 简单的 Java 输入——从键盘输入

java.util包下的Scanner类可用于获取用户从键盘输入的内容,我们在Java Scanner 类这一小节已经介绍过具体使用,实例如下:

import java.util.Scanner;/*** @author colorful@TaleLin*/
public class ScannerDemo {public static void main(String[] args) {// 创建扫描器对象Scanner scanner = new Scanner(System.in);System.out.println("请输入您的姓名:");// 可以将用户输入的内容扫描为字符串String name = scanner.nextLine();// 打印输出System.out.println("你好 ".concat(name).concat(" ,欢迎来到CSDN!"));// 关闭扫描器scanner.close();}
}

运行结果:

请输入您的姓名:
Colorful
你好 Colorful ,欢迎来到CSDN!

2. 什么是流(Stream)

Java 中最基本的输入/输入是使用流来完成的。

流是代表数据源和数据目标的对象,怎么理解这句话呢?简单来说,可以读取作为数据源的流,也可以写入作为数据目标的流。Java中的流是长度不确定的有序字节序列,它是一连串流动的字符,是以先进先出的方式发送信息的通道。

3. 输入输出流的应用场景

上面我们已经了解了输入输出流的基本概念,那么它具体是做什么用的呢?

web产品的开发中,最常开发的功能就是上传文件到服务器了,这个文件的读写过程就要用到输入输出流。对于计算机中文件的读写、复制和删除等操作也都要用到输入输出流。输入输出流可以说是无处不在,下面我们将会介绍 Java 中输入输出流相关的 API

4. File 类

在 Java 中,提供了java.io.File类对文件和目录进行操作。

File 意思为文件,文件在计算机中非常重要,我们编写的 word 文档、PPT 演示文稿、运行游戏的.exe可执行文件以及我们编写的 Java 源代码等等都是文件。

4.1 实例化

要实例化File对象,需要传入一个文件或目录的路径。

File 类提供了如下 4 个构造方法:

  1. File(File parent, String child):从父抽象路径名和子路径名字符串创建新的文件实例;
  2. File(String pathName):通过将给定的路径名字符串转换为抽象路径名,创建一个新的文件实例(最常用);
  3. File(String parent, String child):从父路径名字符串和子路径名字符串创建新的文件实例;
  4. File(URI uri):通过将给定的文件: URI转换为抽象路径名,创建一个新的文件实例。

Windows系统为例,在桌面下有一个mybj目录,该目录下有一个Hello.java文件和一个空的images目录。

我们可以单击Windows的路径栏,来获取mybj目录的绝对路径。

有了目录和文件以及路径。我们分别实例化两个File对象,实例如下:

import java.io.File;public class FileDemo1 {public static void main(String[] args) {// 传入目录绝对路径File dir = new File("C:\\Users\\Colorful\\Desktop\\mybj\\images");// 传入文件绝对路径File file = new File("C:\\Users\\Colorful\\Desktop\\mybj\\Hello.java");// 打印两个File对象System.out.println(dir);System.out.println(file);}
}

我们可以直接打印File对象,File类重写了toString()方法,查看 Java 源码,toString()方法直接返回了getPath()实例方法,此方法返回构造方法传入的路径字符串:

运行结果:

C:\Users\Colorful\Desktop\mybj\images
C:\Users\Colorful\Desktop\mybj\Hello.java

上面代码中,使用\\表示Windows下的路径分隔符\LinuxMacOS下使用正斜杠/作为路径分隔符。假设是同样的目录结构,在MacOSLinux下是这样表示的:

File dir = new File("/Users/Colorful/Desktop/mybj/images");

因为Windows平台和其他平台路径分隔符不同,使用不同平台的开发者就难以保证路径分隔符的统一。

为了保证代码更好的兼容性,File类下提供了一个静态变量separator,用于表示当前平台的系统分隔符:

// 根据当前平台输出 / 获取 \
System.out.println(File.separator);

4.2 绝对路径和相对路径

在实例化File对象时,既可以传入绝对路径,也可以传入相对路径。

绝对路径是以根目录开头的完整的全路径,上面代码实例中传入的是绝对路径,我们再来看看什么是相对路径,以及如何传入相对路径。

相对路径指的是当前文件所在的路径引起的跟其它文件(或文件夹)的路径关系。听起来有点绕,我们举例来说明一下,在mybj目录下新建一个FileDemo2.java文件,此时mybj目录的文件目录树结构如下:

└── mybj├── FileDemo2.java├── Hello.java└── images

内容如下:

import java.io.File;
import java.io.IOException;public class FileDemo2 {public static void main(String[] args) throws IOException {// 传入目录相对路径File dir = new File(".\\images");File mybjDir = new File("..\\mybj");// 传入文件相对路径File file = new File(".\\Hello.java");}
}

上面代码的File构造方法中传入的就是相对路径,代码中的.表示当前目录,..表示上级目录。

Tips: 我们在实例化 File 对象时,不会产生对磁盘的操作,因此即使传入的文件或目录不存在,代码也不会抛出异常。只有当调用 File 对象下的一些方法时,才会对磁盘进行操作。

File 对象下有 3 个表示路径的实例方法:

  1. String getPath():将抽象路径名转换为路径名字符串;
  2. String getAbsolute():返回此抽象路径名的绝对路径名字符串;
  3. String getCanonicalPath():返回此抽象路径名的规范路径名字符串。

我们可以调用这 3 个方法并打印结果,实例如下:

import java.io.File;
import java.io.IOException;public class FileDemo2 {public static void main(String[] args) throws IOException {// 传入目录相对路径File imagesDir = new File(".\\images");File mybjDir = new File("..\\mybj");// 传入文件相对路径File file = new File(".\\Hello.java");System.out.println("-- imagesDir ---");System.out.println(imagesDir.getPath());System.out.println(imagesDir.getAbsolutePath());System.out.println(imagesDir.getCanonicalPath());System.out.println("-- mybjDir ---");System.out.println(mybjDir.getPath());System.out.println(mybjDir.getAbsolutePath());System.out.println(mybjDir.getCanonicalPath());System.out.println("-- file ---");System.out.println(file.getPath());System.out.println(file.getAbsolutePath());System.out.println(file.getCanonicalPath());}
}

运行结果:

-- imagesDir ---
.\images
C:\Users\Colorful\Desktop\mybj\.\images
C:\Users\Colorful\Desktop\mybj\images
-- mybjDir ---
..\mybj
C:\Users\Colorful\Desktop\mybj\..\mybj
C:\Users\Colorful\Desktop\mybj
-- file ---
.\Hello.java
C:\Users\Colorful\Desktop\mybj\.\Hello.java
C:\Users\Colorful\Desktop\mybj\Hello.java

通过运行结果可以看出,规范路径名就是把...转换为标准的绝对路径。

4.3 判断对象是文件还是目录

我们可以通过如下两个方法判断 File 对象是文件还是目录:

  1. boolean isFile():测试此抽象路径名表示的文件是否为普通文件;
  2. boolean isDirectory():测试此抽象路径名表示的文件是否为目录。

实例如下:

import java.io.File;public class FileDemo3 {public static void printResult(File file) {// 调用isFile()方法并接收布尔类型结果boolean isFile = file.isFile();String result1 = isFile ? "是已存在文件" : "不是已存在文件";// 掉用isDirectory()方法并接收布尔类型而己过boolean directory = file.isDirectory();String result2 = directory ? "是已存在目录" : "不是已存在目录";// 打印该file对象是否是已存在文件/目录的字符串结果System.out.print(file);System.out.print('\t' + result1 + '\t');System.out.println(result2);}public static void main(String[] args) {// 传入目录绝对路径File dir = new File("C:\\Users\\Colorful\\Desktop\\mybj\\images");// 传入文件绝对路径File file = new File("C:\\Users\\Colorful\\Desktop\\mybj\\test.java");FileDemo3.printResult(dir);FileDemo3.printResult(file);}
}

运行结果:

C:\Users\Colorful\Desktop\mybj\images	不是已存在文件	是已存在目录
C:\Users\Colorful\Desktop\mybj\test.java	不是已存在文件	不是已存在目录

代码中我们封装了一个静态方法printResult(),此方法打印 File 对象是否是文件/目录。值得注意的是,我们的磁盘中不存在C:\Users\Colorful\Desktop\mybj\test.java,因此无论调用isFile()方法还是isDirectory()方法,其返回结果都为false

4.4 创建和删除目录

4.4.1 创建目录

对于一个不存在的目录,我们可以使用boolean mkdir()方法创建一个目录。例如,我们想在mybj目录下创建一个codes目录,就可以使用该方法编写一段创建目录的代码。

实例如下:

import java.io.File;public class FileDemo4 {public static void main(String[] args) {// 传入目录绝对路径File dir = new File("C:\\Users\\Colorful\\Desktop\\mybj\\codes");if (!dir.exists()) {// 调用 mkdir() 方法boolean result = dir.mkdir();if (result) {System.out.println("目录创建成功");}}}
}

代码中我们调用了File对象的boolean exists()方法,此方法用于测试由此抽象路径名表示的文件或目录是否存在。当不存在时,我们才去创建目录。

运行代码前,mybj文件目录树结构如下:

└── mybj├── FileDemo2.java├── Hello.java└── images

运行结果:

目录创建成功

运行代码后,mybj目录下多了一个codes目录,树结构如下:

└── mybj├── FileDemo2.java├── Hello.java├── images└── codes

另外,File 类也提供了一个boolean mkdirs()方法,用来创建由这个抽象路径名命名的目录,包括任何必要但不存在的父目录。实际上是在递归执行mkdir()方法。

4.4.2 删除目录

如果我们想要删除刚刚创建的codes目录,可以调用boolean delete()方法,实例如下:

import java.io.File;public class FileDemo5 {public static void main(String[] args) {// 传入目录绝对路径File dir = new File("C:\\Users\\Colorful\\Desktop\\mybj\\codes");if (dir.exists()) {// 调用 delete() 方法boolean deleted = dir.delete();if (deleted) {System.out.println("删除目录成功");}}}
}

运行代码前,mybj文件目录树结构如下:

└── mybj├── FileDemo2.java├── Hello.java├── images└── codes

运行结果:

删除目录成功

运行代码后,树结构如下:

└── mybj├── FileDemo2.java├── Hello.java└── images

4.5 创建和删除文件

对于文件类型的File对象,可以通过boolean createNewFile()方法创建一个新文件,使用boolean delete()方法删除文件。其调用方法和创建/删除目录相同,此处不再赘述。

关于更多File对象的操作,可翻阅官方文档。

5. InputStream 抽象类

5.1 概述

java.io.InputStream抽象类是 Java 提供的最基本的输入流,它是所有输入流的父类。其最常用的抽象方法int read()签名如下:

public abstract int read() throws IOException;

这个方法用于读取输入流的下一个字节,返回的int如果为-1,则表示已经读取到文件末尾。

InputStream与其子类的 UML 图如下所示:

5.2 FileInputStream 实现类

我们将以最常用的FileInputStream实现类为例进行学习。其他实现类大同小异,如有需要可翻阅官方文档。

FileInputStream就是从文件流中读取数据,我们在mybj目录下新建一个文本文档Hello.txt,并输入如下内容:

Hello mybj!

读取Hello.txt文件中数据的实例代码如下:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class FileInputStreamDemo1 {public static void main(String[] args) throws IOException {// 实例化文件流FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Colorful\\Desktop\\mybj\\Hello.txt");for (;;) {int n = fileInputStream.read();if (n == -1) {// read() 方法返回-1 则跳出循环break;}// 将n强制转换为 char 类型System.out.print((char) n);}// 关闭文件流fileInputStream.close();}
}

运行结果:

Hello mybj!

如果我们打开了一个文件并进行操作,不要忘记使用close()方法来及时关闭。这样可以让系统释放资源。

6. OutputStream 抽象类

6.1 概述

OutPutStream抽象类是与InputStream对应的最基本的输出流,它是所有输出流的父类。其最常用的抽象方法void write(int b)签名如下:

public abstract void write(int b) throws IOException;

这个方法用于写入一个字节到输出流。

OutputStream与其子类的 UML 图如下所示:

6.2 FileOutputStream 实现类

我们同样以最常用的FileOutputStream实现类为例进行学习。其他实现类大同小异,如有需要可翻阅官方文档。

FileOutputStream就是向文件流中写入数据,下面我们向mybj目录下的文本文档Hello.txt输入一段字符串HHH。完整实例如下:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class FileOutputStreamDemo1 {public static void main(String[] args) throws IOException {FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Colorful\\Desktop\\mybj\\Hello.txt");// 写入 3 个H字符fileOutputStream.write(72);fileOutputStream.write(72);fileOutputStream.write(72);fileOutputStream.close();}
}

运行代码后,Hello.txt后面成功写入了 3 个字符H

7. 小结

通过本小节的学习,我们知道了什么是输入输出流的概念,输入输出流经常用于上传文件到服务器的场景。想要通过 Java 操作文件和目录,要学会使用java.io.File类,InputStreamOutputStream分别是所有输入流和所有输出流的父类,FileInputStream实现了文件流的输入,FileOutputStream实现了文件流的输出。还有很多其它实现类我们没有介绍到,但使用方法大同小异,希望同学可以在用到时自行查阅文档来学习。

相关文章:

36. 【Java教程】输入输出流

本小节将会介绍基本输入输出的 Java 标准类,通过本小节的学习,你将了解到什么是输入和输入,什么是流;输入输出流的应用场景,File类的使用,什么是文件,Java 提供的输入输出流相关 API 等内容。 1…...

Visual C++2010学习版详细安装教程(超详细图文)

Visual C 介绍 Visual C(简称VC)是微软公司推出的一种集成开发环境(IDE),主要用于开发C和C语言的应用程序。它提供了强大的编辑器、编译器、调试器、库和框架支持,以及丰富的工具和选项,使得开…...

matlab图像处理入门

matlab在学校科研,仿真及基于模型开发的工作中有重要作用,在图像处理方面由于省去了复杂的上位机开发流程,因此可以让用户快速开发验证算法,下面简要介绍其在图像处理方面的应用。 matlab开发图像处理算法的流程主要是&#xff0c…...

关于线程池面试题,使用“豆包”训练答案

我提问: 问题描述 下面是一个有关线程池调度的面试真题,来自于疯狂创客圈社群: 一个线程池的核心线程数为10个,最大线程数为20个,阻塞队列的容量为30。现在提交45个 任务,每个任务的耗时为500毫秒。 请问&…...

【WRF理论第二期】模型目录介绍

WRF理论第二期:模型目录介绍 1 WRF主目录2 WPS主目录3 编译后的可执行文件4 运行目录参考 了解 WRF 模型的目录结构有助于有效地管理和操作模型,从而确保模拟和分析工作的顺利进行。以下分解介绍WRF主目录、WPS主目录等。 Github-wrf-model/WRF 1 WRF…...

从了解到掌握 Spark 计算框架(一)Spark 简介与基础概念

文章目录 什么是 Spark?核心特点 Spark 对比 MapReduceSpark 编程模型RDDDataFrameDataset Spark 运行模式Spark 生态 什么是 Spark? Spark 是一个基于内存的分布式计算框架,最初由加州大学伯克利分校的 AMPLab 开发,后来捐赠给了…...

linux bind函数

bind函数的目的是让把客户端对应的端口(port)地址和ip地址绑定到客户端 [参考](Linux之bind 函数(详细篇)_linux bind函数-CSDN博客)...

Flink系列一:flink光速入门 (^_^)

引入 spark和flink的区别:在上一个spark专栏中我们了解了spark对数据的处理方式,在 Spark 生态体系中,对于批处理和流处理采用了不同的技术框架,批处理由 Spark-core,SparkSQL 实现,流处理由 Spark Streaming 实现&am…...

PySpark特征工程(III)--特征选择

有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。 特征工程是数据分析…...

Mongodb的数据库简介、docker部署、操作语句以及java应用

Mongodb的数据库简介、docker部署、操作语句以及java应用 本文主要介绍了mongodb的基础概念和特点,以及基于docker的mongodb部署方法,最后介绍了mongodb的常用数据库操作语句(增删改查等)以及java下的常用语句。 一、基础概念 …...

七大战略性新兴产业崭露头角:新能源电燃灶或将成为未来厨房新宠

近日,在国家发布的七大战略性新兴产业名单中,新能源产业赫然在列,作为其中的重要组成部分,华火新能源电燃灶凭借其独特的优势,正逐渐走进人们的视野,有望成为未来厨房的新宠。 华火新能源电燃灶作为清洁能源…...

C#进阶-用于Excel处理的程序集

在.NET开发中,处理Excel文件是一项常见的任务,而有一些优秀的Excel处理包可以帮助开发人员轻松地进行Excel文件的读写、操作和生成。本文介绍了NPOI、EPPlus和Spire.XLS这三个常用的.NET Excel处理包,分别详细介绍了它们的特点、示例代码以及…...

持续总结中!2024年面试必问 20 道 Kafka面试题(五)

上一篇地址:持续总结中!2024年面试必问 20 道 Kafka面试题(四)-CSDN博客 九、请解释Kafka中的Zookeeper的作用。 在Kafka中,ZooKeeper扮演着至关重要的角色,主要负责集群管理、协调和状态同步等功能。以下…...

Draw.io 使用详细教程

Draw.io 是一款功能强大的在线绘图工具,适用于创建流程图、网络图、组织结构图、UML 图等。以下是详细的使用教程,包括基本操作、快捷键、常用技巧和进阶技巧。 1. 创建新图 选择存储位置 首次使用时,系统会询问你要将图保存到哪里。你可以…...

人工智能学习笔记(1):了解sklearn

sklearn 简介 Sklearn是一个基于Python语言的开源机器学习库。全称Scikit-Learn,是建立在诸如NumPy、SciPy和matplotlib等其他Python库之上,为用户提供了一系列高质量的机器学习算法,其典型特点有: 简单有效的工具进行预测数据分…...

PromptPort:为大模型定制的创意AI提示词工具库

PromptPort:为大模型定制的创意AI提示词工具库 随着人工智能技术的飞速发展,大模型在各行各业的应用越来越广泛。而在与大模型交互的过程中,如何提供精准、有效的提示词成为了关键。今天,就为大家介绍一款专为大模型定制的创意AI…...

IDEA升级web项目为maven项目乱码

今天将一个java web项目改造为maven项目。 首先&#xff0c;创建一个新的maven项目&#xff0c;将文件拷贝到新项目中。 其次&#xff0c;将旧项目的jar包&#xff0c;在maven的pom.xml做成依赖 接着&#xff0c;把没有maven坐标的jar包在编译的时候也包含进来 <build>…...

存内计算与扩散模型:下一代视觉AIGC能力提升的关键

目录 前言 视觉AIGC的ChatGPT4.0时代 扩散模型的算力“饥渴症” 存内计算解救算力“饥渴症” 结语 前言 ​ 在这个AI技术日新月异的时代&#xff0c;我们正见证着前所未有的创新与变革。尤其是在视觉内容生成领域&#xff08;AIGC&#xff0c;Artificial Intelligence Generate…...

如何上传模型素材创建3D漫游作品?

一、进入3D空间漫游互动工具编辑器 进入720云官网-点击“开始创作”-选择3D空间漫游-进入到作品创建页面。 二、上传模型及素材&#xff0c;创建生成3D空间漫游模型 1.创建3D空间作品&#xff1a;您可以选择新建空白作品或使用720云提供的预设空间模板&#xff0c;本篇主要介绍…...

NFS p.1 服务器的部署以及客户端与服务端的远程挂载

目录 介绍 应用 NFS的工作原理 NFS的使用 步骤 1、两台机子 2、安装 3、配置文件 4、实验 服务端 准备 启动服务&#xff1a; 客户端 准备 步骤 介绍 NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;是一种古老的用于在UNIX/Linux主…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...