初始JavaEE篇 —— 文件操作与IO
找往期文章包括但不限于本期文章中不懂的知识点:
个人主页:我要学编程程(ಥ_ಥ)-CSDN博客
所属专栏:JavaEE
目录
文件介绍
Java标准库中提供操作文件的类
文件系统操作
File类的介绍
File类的使用
文件内容操作
二进制文件的读写操作
文本文件的读写操作
文件介绍
文件分为两种:一种是狭义上的文件;另一种是广义上的文件。狭义的文件就是指机器上存储数据的地方,在电脑上面,C盘、D盘这些就可以称为文件;而广义的文件是指一切资源。例如,网卡、CPU等就可以被抽象成文件。抽象成文件后,就可以更加方便地去操作,也相当于是一层封装。我们今天要学习的是狭义上的文件。也就是C盘、D盘上的文件。
而狭义的文件也分为两种,一种是目录,也就是文件夹;另外一种就是普通的文件,例如,.txt。
计算机中的文件有很多,我们是使用路径来区分的。
例如,D:\编程学习\Java代码练习\java-jdk17-version\AVLTree\src\AVLTree.java 与 D:\编程学习\Java代码练习\java-jdk17-version\AVLTree\src\Test.java 就是两个不同的路径,也就代表两者不是同一个文件。
文件其实和我们之前学习的树形结构是一样的,只不过前面学习的树形结构主要是二叉树,而这里的文件分类采用的是N叉树的方式而已。
在表示文件的路径中,主流的操作系统都是使用 / ,但是Windows系统既可以用 / ,也可以用 \ 。Windows系统默认是采用 \ 。因为 \ 可能在跟字符一起连用时,会形成转义字符,因此采用的 /。
上面那种路径表示的是绝对路径,还有一种相对路径的表示方法。
.\AVLTree.java ——> 这就是一个相对路径,在相对路径的基础上,需要有一个基准路径,这个点符就代表的是基准路径,而 .. 表示在当前目录的上一级目录。
如果在IDEA中使用 ./AVLTree.java,这里的基准路径是项目所在的目录。或者说 src 所在的目录。
站在程序员的角度,看待文件时分为两种:文本文件与二进行文件,我们后续学习的操作也是根据文件的不同,从而使用不能的类来操作。当然,所有的文件在一定程度上来说都是二进制文件,只不过某些文件的二进行数据在编码表中刚好全部可以查到并且正常解析出来(不会出现乱码的情况)。当我们使用记事本打开文件时,如果是二进制文件那么就会出现乱码的情况,如果不是乱码,那就是文本文件。(有可能这个不是二进制文件,但是打开之后,是我们看不懂的。例如,法语或者是德语之类的)
常见的文本文件:.java 、.c 、.txt等;常见的二进制文件:图像、音频、可执行的程序(.exe)。
Java标准库中提供操作文件的类
Java标准库中提供操作文件的类,有两种:一种用来是操作文件外层、另一种是用来操作文件内容。文件外层就是指创建、删除、重命名等。也被称为文件系统操作。
文件系统操作
Java中使用File类来操作文件系统,在操作任何一个文件之前,都得先创建File对象,即使这个文件是不存在的,我们也需要创建这个File对象才能进行相关操作。
File类的介绍
构造方法:
方法名 | 说明 |
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)创建、删除文件与目录:
public class Test {public static void main(String[] args) throws IOException {// 构造目录File directory = new File("./Test");// 创建目录 ——> 可以根据返回来决定下面执行什么逻辑System.out.println(directory.mkdir()); // 初次创建为true,而后皆为false// 构造文件 ——> 根据父目录+子路径来构造File file1 = new File(directory, "./test1.txt"); // 这里的 . 代指父目录// 创建文件System.out.println(file1.createNewFile());// 构造文件 ——> 直接根据路径来构造File file2 = new File("./Test/test2.txt");// 创建文件System.out.println(file2.createNewFile());// 构造文件 ——> 根据父目录+子路径来构造,父目录为路径File file3 = new File("./Test", "./test3.txt"); // 子路径这里的 . 代指父目录System.out.println(file3.createNewFile());System.out.println(file1.delete()); // trueSystem.out.println(directory.delete()); // false}
}
从上述代码的运行结果,我们可以得出:当目录下存在文件时,不能删除目录。
2)get 系列方法:
public class Test {public static void main(String[] args) throws IOException {// 构造文件File file = new File("./test.txt");// 创建文件file.createNewFile();System.out.println("父目录:"+file.getParent());System.out.println("文件名:"+file.getName());System.out.println("文件路径:"+file.getPath());System.out.println("文件绝对路径:"+file.getAbsoluteFile());System.out.println("文件被修饰的绝对路径:"+file.getCanonicalPath());}
}
运行结果:
1、getParent 与 getPath 都是根据构造文件时的路径来获取的,如果 构造方法中的路径是绝对路径,那么获取到的结果就是绝对路径。
2、文件的绝对路径 与 文件被修饰过的绝对路径两者的区别是:被修饰过的,不会出现点符号,而是直接被解析成完成的路径了;反观,没有被修饰过的就会根据构造文件时的路径来作取舍,如果构造文件的路径中,带有点符号,那么最终的结果中也是带有点符号的,反之则不会有点符号。
3、文件路径 就是直接拿构造方法中传入的文件路径。
3)其余方法:
public class Test {public static void main(String[] args) throws IOException {// 构造目录File directory = new File("./12306");System.out.println("directory创建前是否存在:"+directory.exists());directory.mkdir(); // 创建目录directory.deleteOnExit(); // 在进程结束时,再去销毁System.out.println("directory创建后是否存在:"+directory.exists());System.out.println("directory是否是目录:"+directory.isDirectory());System.out.println("directory是否是文件:"+directory.isFile());// 如果直接调用list(),只会得到一个哈希值,也就是引用的地址// 返回目录下的所有文件名System.out.println(Arrays.toString(directory.list()));// 返回目录下的所有文件名(包括后代的后代)System.out.println(Arrays.toString(directory.listFiles()));}
}
运行结果:
4)renameTo方法:
public class Test {public static void main(String[] args) throws IOException {// 即使没有基准路径,它也是默认在项目路径下创建File file1 = new File("test.txt");file1.createNewFile();File file2 = new File("test3.txt");// 将file1的文件名改为file2的文件名file1.renameTo(file2);System.out.println(file1.getName());}
}
重命名只需要有File对象即可,不需要关注这个对象是否存在。可以理解为这个对象为 name 的载体。
public class Test {public static void main(String[] args) throws IOException {File file1 = new File("test.txt"); // 这个路径是在项目路径下System.out.println(file1.createNewFile());// ".." 代表当前路径的上一级目录File file2 = new File("../test.txt");System.out.println(file1.renameTo(file2));// 打印出文件的绝对路径System.out.println(file1.getCanonicalPath());}
}
如果我们去仔细观察就会发现上述两个file1对象所指向的文件在重命名或者移动之后,对应磁盘中的位置也发生了变化,但是file1对象本身还是指向最初创建的那个文件路径。我们可以理解为file对象指向的是创建时的那个文件路径,如果没有修改指向的话,那么这个对象所指向的位置是不发生变化的,在重命名或者移动文件的前后,只是文件的位置发生了变化,也就是file1对象所指向位置对应的文件被删除了(剪切就是一种删除),但是file1对象还是存在的。如下图所示:
再举个例子:小明、小红两人在谈恋爱,小明经常会去小红家里找她玩。小军也喜欢小红,但是由于小红已经名花有主了,所以他只能默默地将这份爱意埋在心里,但过了一段时间两人分手了,恰巧小红又搬家了,小军刚好知道小红搬到哪里了,所以就开始疯狂追小红,两人也顺利的在一起了。
上面例子中,小明就是file1对象,知道着小红的住址,也就是文件的具体地址,后面两人分手了,也就只有小军知道小红的住址了,这就是移动文件之后,只有file2对象保存着文件的具体地址,而file1对象只是保存着刚创建时的文件地址。
文件内容操作
上面是文件的系统操作,下面我们来学习文件的内容操作。文件的内容操作,就是去进行 IO,也就是输入与输出。来修改文件的内容。
因为文件分为文本文件与二进制文件,所以文件的读写操作,也是分别有两种不同的方式。一种是针对文本文件的读写操作,另一种是针对二进制文件的读写操作。Java中是通过流对象来操作文件的,字节流可以用来读写二进制文件,字符流可以用来读写文本文件。
二进制文件的读写操作
流对象也是一种资源,因此我们在使用的时候,也是需要先打开资源,再是使用资源,最后还得关闭资源。
打开资源,也就是创建具体的流对象。
读写操作,有两个祖宗类:InputStream、OutputStream,这两个都是抽象类,后面都有一些继承它们的子类,最常用的就是 FIleInputStream、FIleOutputStream。
读操作的构造方法:
方法 | 说明 |
FileInputStream(File file) | 利用 File 构造文件输入流 |
FileInputStream(String name) | 利用文件路径构造文件输入流 |
注意:对于 OutputStream 来说,默认情况下会尝试创建不存在的文件,而对于 InputStream 来说,只会去寻找文件,如果没找到的话,就会抛异常。
读操作的具体方法:
方法 | 说明 |
int read() | 读取一个字节的数据,返回-1代表已经完全读完了 |
int read(byte[] b) | 最多读取 b.length 字节的数据到 b中,返回实际读到的数量;-1代表以及读完了 |
int read(byte[] b, int off, int len) | 最多读取len-off 字节的数据到 b中,从 off 开始读,返回实际读到的数量;-1代表以及读完了 |
void close() | 关闭字节流 |
无参的版本,返回的是读取到的具体数据,带有 字节数组的版本,返回的是读取的数量。
写操作的构造方法:
方法 | 说明 |
FileOutputStream(File file) | 利用 File 构造文件输出流 |
FileOutputStream(File file, boolean append) | 利用 File、append 构造文件输出流 |
FileOutputStream(String name) | 利用文件路径构造文件输出流 |
FileOutputStream(String name, boolean append) | 利用文件路径、append构造文件输出流 |
写操作的具体方法:
方法 | 说明 |
void write(int b) | 将指定的字节写入文件 |
void write(byte[] b) | 将b这个字节数组中的数据全部写入文件中 |
void write(byte[] b, int off, int len) | 将 b 这个字节数组中从off 开始的数据写入文件中,一共写len 个 |
void close() | 关闭字节流 |
代码演示:
public class Test {public static void main(String[] args) throws IOException {// 先创建一个文件File file = new File("./test.txt");boolean isCreated = file.createNewFile();if (isCreated) {// 开始往文件中写入数据// 1、打开文件输出流FileOutputStream fos = new FileOutputStream(file);// 2、写入数据// 因为这里的输出流是字节流,所以需要将字符串转换为字节数组Scanner scanner = new Scanner(System.in);System.out.println("请输入要写入的文件内容:");String str = scanner.nextLine();fos.write(str.getBytes());// 3、关闭输出流fos.close();// 开始往文件中读取数据// 1、打开文件输入流FileInputStream fis = new FileInputStream(file);// 2、读取数据byte[] bytes = new byte[1024]; // 存放到数组中// 这里的读取的时候,最多读取1024个字节int len = 0;while ((len = fis.read(bytes))!= -1) {// 构造一个String对象,将字节数组转换为字符串System.out.println(new String(bytes, 0, len));}// 3、关闭输入流fis.close();} else {System.out.println("文件创建失败");}}
}
运行结果:
注意:每创建一个 OutputStream 对象(包括子类)会清除上次文件中残留的内容,如果想要在上一次的内容上继续进行 "写" 操作,只能在构造方法中,传入一个 true,表示可追加模式
文件的读写操作可以总结出一个模版:
字节流:
1、写数据到文件中;
1)创建一个FileOutputStream的输入流对象,
2)利用控制台输入数据到字符串中,将字符串转为字节数组作为参数传入write方法,
3)关闭输入流对象,
2、从文件中读数据;
1)创建一个FileInputStream的输入流对象,
2)创建一个字节数组,利用read方法从文件中读取数据到字节数组中(当read的返回值为-1时,便可以结束读取了),
3)关闭输入流对象
字符流也是适用的,只不过是换了输入流与输出流对象罢了。
文本文件的读写操作
读写操作,有两个祖宗类:Reader、Writer,这两个都是抽象类,后面都有一些继承它们的子类,最常用的就是 FileReader、FileWriter。
读操作的构造方法:
方法 | 说明 |
FileReader(String fileName) | 利用文件路径构造文件输入流 |
FileReader(File file) | 利用 File 构造文件输入流 |
读操作的具体方法:
方法 | 说明 |
int read() | 一次读入一个字符,返回字符的整数值,若到达文件末尾,则返回 -1。 |
int read(char[] cbuf) | 最多读取 cbuf.length 个字符的数据到 cbuf 中,返回实际读到的数量;-1代表以及读完了 |
int read(char[] cbuf, int off, int n) | 最多读取len-off 字符的数据到 cbuf 中,从 off 开始读,返回实际读到的数量;-1代表以及读完了 |
void close() | 关闭字符流 |
写操作的构造方法:
方法 | 说明 |
FileWriter(String fileName) | 利用文件路径构造文件输出流 |
FileWriter(File file) | 利用 File 构造文件输出流 |
写操作的具体方法:
方法 | 说明 |
void write(int c) | 将指定的字节写入文件 |
void write(char[] cbuf) | 将 cbuf这个字符数组的数据全部写入文件中 |
void write(String str) | 将指定字符串写入文件 |
void close() | 关闭字符流 |
代码演示:
public class Test {public static void main(String[] args) throws IOException {// 创建文件File file = new File("./test.txt");boolean isCreated = file.createNewFile();if (isCreated) {// 写入数据// 1、打开文件输出流FileWriter writer = new FileWriter(file);// 2、往文件中写入数据Scanner scanner = new Scanner(System.in);System.out.println("请输入要写入文件的数据:");String str = scanner.nextLine();writer.write(str);// 3、关闭输出流对象writer.close();// 读取数据// 1、打开文件输入流FileReader reader = new FileReader(file);// 2、将文件的中的数据读取出来char[] chars = new char[1024];int len = 0;while ((len = reader.read(chars)) != -1) {System.out.println(new String(chars, 0, len));}} else {System.out.println("文件创建失败");}}
}
运行结果:
注意:FileWriter 也是默认是覆盖模式,只要传入 true,这样下一次在同一个文件中进行写操作时,不会清除其中的内容,而是会从最后一个字符开始写。
Java7之后,就引进了 try-with-resources的语法。这个可以避免我们忘记释放资源,从而导致的程序异常。
代码演示:
public class Test {public static void main(String[] args) throws IOException {String filePath = "test.txt";// 使用 try-with-resources 自动关闭资源try (FileReader fr = new FileReader(filePath)) {int len = 0;char[] chars = new char[1024];while ((len = fr.read(chars)) != -1) {System.out.println(new String(chars, 0, len));}} catch (IOException e) {e.printStackTrace();}}
}
进入 try 时,就会打开资源,当除了 try 的{} 时,就会自动释放资源。
好啦!本期 初始JavaEE篇 —— 文件操作与IO 的学习之旅就到此结束啦!我们下一期再一起学习吧!
相关文章:

初始JavaEE篇 —— 文件操作与IO
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 文件介绍 Java标准库中提供操作文件的类 文件系统操作 File类的介绍 File类的使用 文件内容操作 二进制文件的读写操作…...
GitLab实现 HTTP 访问和 SMTP 邮件发送
GitLab实现 HTTP 访问和 SMTP 邮件发送 本教程详细记录了如何配置 SMTP 邮件通知、实现外网 HTTP 访问,并分享在配置过程中遇到的问题及解决方法。 一、准备工作 安装 Docker:确保在 Synology NAS 上安装 Docker 应用。下载 GitLab 镜像:在…...

HarmonyOS ArkTS 下拉列表组件
Entry Component struct Index {defaultValue: string 下拉列表;// 定义选项数组,包含 value 和可选的 labeloptions: Array<SelectOption> [{ value: aaa },{ value: bbb },{ value: ccc },{ value: ddd },{ value: eee },{ value: fff },{ value: ggg },{…...

zabbix监控Linux系统
1. zabbix agent安装 #sudo rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-4.el8.noarch.rpm #sudo dnf clean all #yum install zabbix-agent -y Running transaction test Transaction test succeeded. Running transactionPreparing …...
线性表-数组描述补充 迭代器(C++)
补充线性表数组实现的迭代器部分 知识点: typedef是C语言中的一个关键字,它的主要作用是为一种数据类型定义一个新的名字(别名)。 在 C 的 STL(Standard Template Library)中,迭代器是连接容…...

vue3 + element-plus 的 upload + axios + django 文件上传并保存
之前在网上搜了好多教程,一直没有找到合适自己的,要么只有前端部分没有后端,要么就是写的不是很明白。所以还得靠自己摸索出来后,来此记录一下整个过程。 其实就是不要用默认的 action,要手动实现上传方式 http-reque…...

dm 创建数据库实例【window】
参考链接:配置实例 1)打开 DM 数据库配置助手 2)按照默认的进行 字符串大小写敏感:譬如 mysql 默认是大小写不敏感,如果在迁移中还选择了 保持对象大小写,那么就会出现一种情况就是每次查询等带有表名的都…...
Docker实践与应用举例:从入门到进阶
Docker实践与应用举例:从入门到进阶 在云计算和微服务架构日益盛行的今天,Docker作为一种轻量级的容器化技术,凭借其高效、灵活、可移植的特点,迅速成为了开发和运维团队的首选工具。本文将通过深入浅出的方式,探讨Do…...
【LeetCode】【算法】560. 和为 K 的子数组
LeetCode 560. 和为 K 的子数组 题目描述 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 思路 思路:前缀和 定义数组preSum[nums.length1],在里面计算nums…...

Webots控制器编程
本文主要内容是如何编写Webots控制器,使用语言为Python。 文章目录 1. 新增控制器2. Hello World Example3. 读取传感器4. 使用执行器5. 理解step和robot.step函数6. 同时使用传感器和执行器7. 控制器参数 1. 新增控制器 对机器人Robot新增控制器的方式࿱…...

舷外机,高效动力的选择,可靠性能的保障_鼎跃安全
舷外机是现代船只动力系统中的核心设备,广泛应用于娱乐船、渔船、巡逻船、救援船等多种场景。它不仅提供船只的动力支持,还因其结构简便、操作灵活和维护方便,成为水上作业的重要组成部分。 一、舷外机的功能作用 1. 强劲动力源 舷外机是船…...

计算机新手练级攻略——如何搜索问题
目录 计算机学生新手练级攻略——如何搜索问题1.明确搜索意图2.使用精确关键词3.使用专业引擎搜索4.利用好技术社区1. Stack Overflow2. GitHub3. IEEE Xplore4. DBLP 5.使用代码搜索工具1. GitHub 代码搜索2. Stack Overflow 代码搜索3. Papers with Code4. IEEE Xplore 6.查阅…...

echarts-gl 3D柱状图配置
1. 源码 此demo可以直接在echarts的编辑器中运行 option {title: {text: 产量图,textStyle: {color: rgba(255, 255, 255, 1),fontSize: 17},left: center},tooltip: {},legend: {show: false,orient: vertical,x: left,top: 0,right: 20,textStyle: {fontSize: 12}},visualM…...

设计模式之模版方法模式(Template)
一、模版方法模式介绍 1、模版方法模式定义: 模板方法模式(template method pattern)原始定义是:在操作中定义算法的框架,将一些 步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法中的算法可以理…...

背包九讲——背包问题求具体方案
目录 背包问题求具体方案 1. 01 背包问题 题目:12. 背包问题求具体方案 - AcWing题库 算法思路: 代码实现: 2. 多重背包问题 算法思路: 3. 完全背包问题 算法思路: 代码实现: 背包问题第九讲—…...

Python http打印(http打印body)flask demo(http调试demo、http demo、http printer)
文章目录 代码解释 代码 # flask_http_printer.pyfrom flask import Flask, request, jsonify import jsonapp Flask(__name__)app.route(/printinfo, methods[POST]) def print_info():# 分隔符separator "-" * 60# 获取请求头headers request.headers# 获取 JS…...
JSF HTML标签教程一口气讲完!(下)
JSF OutputScript示例 JSF教程 - JSF OutputScript示例 h:outputScript标记渲染类型为“script"的HTML元素,类型为“text/javascript"。 此标记将外部JavaScript文件添加到JSF页面。 以下JSF标记 <h:outputScript library"js" name"…...
cmake报错The link interface of target “gRPC::grpc“ contains: OpenSSL::SSL 解决
系统环境:麒麟V10 报错描述: The link interface of target "gRPC::grpc" contains: OpenSSL::SSL but the target was not found. Possible reasons include: * There is a typo in the target name. * A find_package call is missing fo…...

C语言PythonBash:空白(空格、水平制表符、换行符)与转义字符
C语言 空白 C语言中的空白(空格、水平制表符、换行符)被用于分隔Token,因此Token间可以有任意多个空白。 // 例1 printf("Hello, World!"); 例1中存在5个Token,分别是: printf("Hello, World! \n&qu…...
【Python】轻松解析JSON与XML:Python标准库的json与xml模块
轻松解析JSON与XML:Python标准库的json与xml模块 在现代数据处理与交换中,JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)是最常用的两种数据格式。它们广泛应用于API数据传输、配置…...
Amazon RDS on AWS Outposts:解锁本地化云数据库的混合云新体验
在混合云架构成为企业数字化转型标配的今天,如何在本地数据中心享受云数据库的强大能力,同时满足数据本地化、低延迟访问的严苛需求?Amazon RDS on AWS Outposts 给出了完美答案——将AWS完全托管的云数据库服务无缝延伸至您的机房࿰…...
Python网页自动化测试,DrissonPage库入门说明文档
🛰️ 基本逻辑 操作浏览器的基本逻辑如下: 创建浏览器对象,用于启动或接管浏览器获取一个 Tab 对象使用 Tab 对象访问网址使用 Tab 对象获取标签页内需要的元素对象使用元素对象进行交互 除此以外,还能执行更为复杂的操作&am…...

低代码采购系统搭建:鲸采云+能源行业订单管理自动化案例
在能源行业数字化转型浪潮下,某大型能源集团通过鲸采云低代码平台,仅用3周时间就完成了采购订单管理系统的定制化搭建。本文将揭秘这一成功案例的实施路径与关键成效。 项目背景与挑战 该企业面临: 供应商分散:200供应商使用不同…...
易语言是什么?易语言能做什么?
易语言(EPL)是什么? 易语言(Easy Programming Language,简称EPL)是一款面向中文用户的编程语言,由中国人吴涛于2000年开发,专为降低编程门槛设计。其核心特点是…...
Ntfs!ReadIndexBuffer函数分析之nt!CcGetVirtualAddress函数之nt!CcGetVacbMiss
第一部分: NtfsMapStream( IrpContext, Scb, LlBytesFromIndexBlocks( IndexBlock, Scb->ScbType.Index.IndexBlockByteShift ), Scb->ScbType.Index.BytesPerIndexBuffer, &am…...

leetcode_66.加一
题目链接 这道题归类在力扣的数学类中,应该算是一道思维的简单题吧 题是这样的,根据题目我们不难理解,这个题就是在最后一位加 1 然后返回,正如示例所说的那样,当然这很符合我们人的思维,写这种算法题最重要…...

227.2018年蓝桥杯国赛 - 交换次数(中等)- 贪心
227. 交换次数(贪心) 1. 2018年蓝桥杯国赛 - 交换次数(中等) 标签:2018 暴力 国赛 1.1 题目描述 IT 产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯(简称 BAT )在某海滩进行招聘活动。…...
ArkUI-X与Android桥接通信之消息通信
平台桥接用于客户端(ArkUI)和平台(Android或iOS)之间传递消息,即用于ArkUI与平台双向数据传递、ArkUI侧调用平台的方法、平台调用ArkUI侧的方法。本文主要介绍Android平台与ArkUI交互,ArkUI侧具体用法请参考…...

【CUDA 】第5章 共享内存和常量内存——5.3减少全局内存访问(2)
CUDA C编程笔记 第五章 共享内存和常量内存5.3 减少全局内存访问5.3.2 使用展开的并行规约思路reduceSmemUnroll4(共享内存)具体代码:运行结果意外发现书上全局加载事务和全局存储事务和ncu中这两个值相同 5.3.3 动态共享内存的并行规约reduc…...
SSE (Server-Sent Events) 技术简介
一、SSE 技术概述 Server-Sent Events (SSE) 是一种允许服务器向客户端实时推送数据的 Web 技术,它基于 HTTP 协议实现服务器到客户端的单向通信。 基本特点 ● 单向通信:仅服务器→客户端方向 ● 基于HTTP:使用标准HTTP协议,无需…...