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

Lua 第7部分 输入输出

        由于 Lua 语言强调可移植性和嵌入性 , 所以 Lua 语言本身并没有提供太多与外部交互的机制 。 在真实的 Lua 程序中,从图形、数据库到网络的访问等大多数 I/O 操作,要么由宿主程序实现,要么通过不包括在发行版中的外部库实现。 单就 Lua 语言而言,只提供了 ISO C语言标准支持的功能, 即基本的文件操作等。 在这一章中,我们将会学习标准库如何支持这些功能。

7.1  简单 I/O 模型

        对于文件操作来说, I/O 库提供了两种不同的模型 。 简单模型虚拟了一个当前输入流和一个当前输出流,其 I/O 操作是通过这些流实现的 。 I/O 库把当前输入流初始化为进程的标准输入( C 语言中的 stdin ),将当前输出流初始化为进程的标准输出( C 语言中的 stdout ) 。 因此 ,当执行类似于 io.read() 这样的语句时,就可以从标准输入中读取一行。

        函数 io.input 和函数 io.output 可以用于改变当前的输入输出流。 调用 io.input(file­name )会以只读模式打开指定文件,并将文件设置为当前输入流。 之后,所有的输入都将来自该文件,除非再次调用 io.input 。 对于输出而言,函数 io.output 的逻辑与之类似。 如果出现错误,这两个函数都会抛出异常。 如果想直接处理这些异常, 则必须使用完整 I/O 模型。

        由于函数 write 比函数 read 简单,我们首先来看函数 write 。 函数 io .write 可以读取任意数量的字符串(或者数字)并将其写人当前输出流。 由于调用该函数时可以使用多个参数,因此应该避免使用 io.write(a..b..c )应该调用 io.write(a, b,  c ) ,后者可以用更少的资源达到同样的效果,并且可以避免更多的连接动作。

        作为原则,应该只在“用后即弃”的代码或调试代码中使用函数 print ; 当需要完全控制输出时,应该使用函数 io.write 。 与函数 print 不同,函数 io.write 不会在最终的输出结果中添加诸如制表符或换行符这样的额外内容。 此外,函数 io.write 允许对输出进行重定向,而函数 print 只能使用标准输出 。 最后 ,函数 print 可以自动为其参数调用 tostring ,这一点对于调试而言非常便利,但这也容易导致一些诡异的 Bug 。

        函数 io.write 在将数值转换为字符串时遵循一般的转换规则;如果想要完全地控制这种转换,则应该使用函数 string.format:

> io.write("sin(3) = ",math.sin(3), "\n")
sin(3) = 0.14112000805987
> io.write(string.format("sin(3) = %.4f\n", math.sin(3)))
sin(3) = 0.1411

        函数 io.read 可以从当前输入流中读取字符串,其参数决定了要读取的数据:

"a"读取整个文件
"l"读取下一行(丢弃换行符)
"L"读取下一行(保留换行符)
"n"读取一个数值
num以字符串读取num个字符

        调用 io.read("a") 可从当前位置开始读取当前输入文件的全部内容。如果当前位置处于文件的末尾或文件为空,那么该函数返回一个空字符串

        因为 Lua 语言可以高效地处理长字符串,所以在 Lua 语言中编写过滤器( filter )的一种简单技巧就是将整个文件读取到一个字符串中 , 然后对字符串进行处理,最后输出结果为:

t = io.read("a")						-- 读取整个文件
t = string.gsub(t, "bad", "good")		-- 进行处理
io.write(t)							    -- 输出结果

        举一个更加具体的例子,以下是一段将某个文件的内容使用 MIME 可打印字符引用编码 进行编码的代码。 这种编码方式将所有非 ASCII 字符编码为 = xx ,其中 xx 是这个字符的十六进制 。 为保证编码的一致性,等号也会被编码 :

t = io.read("all")
t = string.gsub(t, "([\128-\255=])", function(c)return string.format("=%02X", string.byte(c))end)
io.write(t)

函数 string.gsub 会匹配所有的等号及非 ASCII 字符(从 128 到 255 ),并调用指定的函数完成替换。

        调用 io.read (”l ”) 会返回当前输入流的下一行,不包括换行符在内 ; 调用 io.read (” L ”)与之类似,但会保留换行符(如果文件中存在)。 当到达文件末尾时 ,由于已经没有内容可以返回,该函数会返回 nil。 选项 ” l ” 是函数read 的默认参数。 我通常只在逐行处理数据的算法中使用该参数,其他情况则更倾向于使用选项 ” a ” 一次性地读取整个文件,或者像后续介绍的按块读取。

        作为面向行的输入的一个简单例子,以下的程序会在将当前输入复制到当前输出中的同时对每行进行编号

for count = 1, math.huge dolocal line = io.read("L")if line == nil then break endio.write(string.format("%6d ", count), line)
end

不过,如果要逐行迭代一个文件,那么使用 io.lines 迭代器会更简单:

local count = 0
for line in io.lines() docount = count + 1 io.write(string.format("%6d ", count), line, "\n")
end

另一个面向行的输入的例子参见示例 7.1 ,其中给出了一个对文件中的行进行排序的完整程序。

示例 7.1 对文件进行排序的程序

local lines = {}-- 将所有行读取到表"lines"中
for line in io.lines() dolines[#lines + 1] = line 
end-- 排序
table.sort(lines)-- 输出所有的行
for _, l in ipairs(lines) doio.write(l, "\n")
end

        调用 io.read ("n") 会从当前输入流中读取一个数值,这也是函数 read 返回值为数值(整型或者浮点型,与 Lua 语法扫描器的规则一致) 而非字符串的唯一情况。 如果在跳过了空格后,函数 io.read 仍然不能从当前位置读取到数值(由于错误的格式问题或到了文件末尾),则返回 nil。

        除了上述这些基本的读取模式外,在调用函数 read 时还可以用一个数字 n 作为其参数 :在这种情况下,函数 read 会从输入流中读取 n 个字符。 如果无法读取到任何字符(处于文件末尾)则返回 nil ;否则,则返回一个由流中最多 n 个字符组成的字符串 。 作为这种读取模式的示例,以下的代码展示了将文件从 stdin 复制到 stdout 的高效方法:

while true do local block = io.read(2^13)				-- 块大小是8KBif not block then break endio.write(block)
end

        io.read(0) 是一个特例,它常用于测试是否到达了文件末尾 。 如果仍然有数据可供读取,它会返回一个空字符串;否则,则返回 nil 。

        调用函数 read 时可以指定多个选项,函数会根据每个参数返回相应的结果。 假设有一个每行由 3 个数字组成的文件:

如果想打印每一行的最大值,那么可以通过调用函数 read 来一次性地同时读取每行中的3个数字:

6.1 	-3.23		15e12
4.3 	234			1000001
... while true dolocal n1, n2, n3 = io.read("n", "n", "n")if not n1 then break endprint(math.max(n1,n2,n3))
end

7.2  完整 I/O 模型

        简单 I/O 模型对简单的需求而言还算适用,但对于诸如同时读写多个文件等更高级的文件操作来说就不够了 。 对于这些文件操作,我们需要用到完整 I/O 模型 。

        可以使用函数 io.open 来打开一个文件,该函数仿造了 C 语言中的函数 fopen 。 这个函数有两个参数一个参数是待打开文件的文件名,另一个参数是一个模式 ( mode )字符串 。模式字符串包括表示只读的 r、 表示只写的 w (也可以用来删除文件中原有的内容)、表示追加的 a, 以及另外一个可选的表示打开二进制文件的 b 。 函数 io.open 返回对应文件的流。 当发生错误时,该函数会在返回 nil 的同时返回一条错误信息及一个系统相关的错误码 :

> print(io.open("non-existent-file", "r"))
nil     non-existent-file: No such file or directory    2
>
> print(io.open("/etcpasswd", "w"))
nil     /etcpasswd: Permission denied   13

        检查错误的一种典型方法是使用函数 assert:

local f = assert(io.open(filename, mode))

如果函数 io.open 执行失败,错误信息会作为函数 assert 的第二个参数被传人,之后函数assert 会将错误信息展示出来。

        在打开文件后,可以使用方法 read 和 write 从流中读取和向流中写人。 它们与函数 read和 write 类似,但需要使用冒号运算符将它们当作流对象的方法来调用 。 例如,可以使用如下的代码打开一个文件并读取其中所有内容:

local f = assert(io.open(filename, "r"))
local t = f:read("a")
f:close()

        I/O 库提供了三个预定义的 C 语言流的句柄 : io.stdin、 io.stdout 和 io.stderr 。 例如:可以使用如下的代码将信息直接写到标准错误流中:

io.stderr:write(message)

        函数 io.input 和 io.output 允许混用完整 I/O 模型和简单 I/O 模型 。 调用无参数的 io.input()可以获得当前输入流,调用 io.input ( handle )可以设置当前输入流(类似的调用同样适用于函数 io.output ) 。 例如,如果想要临时改变当前输入流,可以像这样:

local temp = io.input() 		-- 保存当前输入流
io.input("newinput")			-- 打开一个新的当前输入流
-- 对新的输入流进行某些操作
io.input():close()				-- 关闭当前流
io.input(temp)					-- 恢复此前的当前输入流

注意, io.read(args) 实际上是 io.input (): read(args)的简写,即函数 read 是用在当前输入流上的 。同样, io.write(args)是 io.output():write(args)的简写。

        除了函数 io.read 外,还可以用函数 io.lines 从流中读取内容。 正如之前的示例中展示的那样,函数 io.lines 返回一个可以从流中不断读取内容的迭代器。 给函数 io.lines 提供一个文件名,它就会以只读方式打开对应该文件的输入流,并在到达文件末尾后关闭该输入流。 若调用时不带参数,函数 io.lines 就从当前输入流读取。 我们也可以把函数 lines当作句柄的一个方法。 此外,从 Lua 5.2 开始 函数 io.lines 可以接收和函数 io.read 一样的参数。 例如,下面的代码会以在 8KB为块迭代,将当前输入流中的内容复制到当前输出流中:

for block in io.input():lines(2^13) doio.write(block)
end

7.3  其他文件操作

        函数 io.tmpfile 返回一个操作临时文件的句柄,该句柄是以读/写模式打开的 。 当程序运行结束后,该临时文件会被自动移除(删除)
        函数 flush 所有缓冲数据写入文件。 与函数 write 一样,我们也可以把它当作 io.flush()使用 ,以刷新当前输出流;或者把它当作方法 f:flush() 使用,以刷新流 f 。
        函数 setvbuf 用于设置流的缓冲模式。该函数的第一个参数是一个字符串:"no" 表示无缓冲,” full ” 表示在缓冲区满时或者显式地刷新文件时才写入数据, "line"表示输出一直被缓冲直到遇到换行符或从一些特定文件(例如终端设备)中读取到了数据。 对于后两个选项,函数 setvbuf 支持可选的第二个参数,用于指定缓冲区大小。在大多数系统中,标准错误流( io.stderr)是不被缓冲的, 而标准输出流(io.stdout ) 按行缓冲。 因此,当向标准输出中写人了不完整的行(例如进度条)时,可能需要刷新这个输出流才能看到输出结果。
        函数 seek 用来获取和设置文件的当前位置,常常使用 f:seek(whence, offset )的形式来调用,其中参数 whence 是一个指定如何使用偏移的字符串 。 当参数 whence 取值为 ” set ”时, 表示相对于文件开头的偏移 ;取值为"cur"时,表示相对于文件当前位置的偏移;取值为 ” end ” 时,表示相对于文件尾部的偏移。 不管 whence 的取值是什么,该函数都会以字节为单位返回当前新位置在流中相对于文件开头的偏移
        whence 的默认值是"cur", offset 的默认值是 0 。 因此,调用函数 file:seek() 会返回当前的位置且不改变当前位置 ; 调用函数 file:seek("set") 会将位置重置到文件开头并返回 0 ;调用函数 file:seek("end ”) 会将当前位置重置到文件结尾并返回文件的大小。 下面的函数演示了如何在不修改当前位置的情况下获取文件大小:

function fsize(file)local current = file:seek()			-- 保存当前位置local size = file:seek("end")		-- 获取文件大小file:seek("set", current)			-- 恢复当前位置return size
end

        此外,函数 os.rename 用于文件重命名,函数 os.remove 用于移除(删除)文件。 需要注意的是,由于这两个函数处理的是真实文件而非流,所以它们位于 os 库而非 io 库中 。
        上述所有的函数在遇到错误时,均会返回 nil 外加一条错误信息和一个错误码。

7.4  其他系统调用

        函数 os.exit 用于终止程序的执行。 该函数的第一个参数是可选的,表示该程序的返回状态,其值可以为一个数值( 0 表示执行成功)或者一个布尔值( true 表示执行成功);该函数的第二个参数也是可选的,当值为 true 时会关闭 Lua 状态,并调用所有析构器释放所占用的所有内存(这种终止方式通常是非必要的,因为大多数操作系统会在进程退出时释放其占用的所有资源)。
        函数 os.getenv 用于获取某个环境变量,该函数的输入参数是环境变量的名称,返回值为保存了该环境变量对应值的字符串:

print(os.getenv("HOME"))		-- /home/lua

        对于未定义的环境变量,该函数返回 nil 。

7.4.1  运行系统命令

        函数 os.execute 用于运行系统命令,它等价于 C 语言中的函数 system 。 该函数的参数为表示待执行命令的字符串返回值为命令运行结束后的状态。 其中,第一个返回值是一个布尔类型,当为 true 时表示程序成功运行完成;第二个返回值是一个字符串,当为 ” exit ”时表示程序正常运行结束,当为 “signal ”时表示因信号而中断 ; 第三个返回值是返回状态(若该程序正常终结)或者终结该程序的信号代码。 例如,在 POSIX 和 Windows 中都可以使用如下的函数创建新目录 :

function createDir(dirname)os.execute("mkdir " .. dirname)
end

        另一个非常有用的函数是 io.popen 。 同函数 os.execute 一样,该函数运行一条系统命令,但该函数还可以重定向命令的输入/输出,从而使得程序可以向命令中写入或从命令的输出中读取。 例如,下列代码使用当前目录中的所有内容构建了一个表:

-- 对于POSIX系统而言,使用'ls'而非'dir'
local f = io.popen("dir /B", "r")
local dir = {}
for entry in f:lines() dodir[#dir + 1] = entry
end

其中 ,函数 io.popen 的第二个参数”r” 表示从命令的执行结果中读取。 由于该函数的默认行为就是这样,所以在上例中这个参数实际是可选的 。

        下面的示例用于发送一封邮件:

local subject = "some news"
local address = "someone@somewhere.org"local cmd = string.format("mail -s '%s' '%s'", subject, address)
local f = io.popen(cmd, "w")
f:write([[ Nothing important to say. -- me ]])
f:close()

注意 , 该脚本只能在安装了相应工具包的 POSIX 系统中运行。 上例中函数 io.popen 的第二个参数是” w ”, 表示向该命令中写入。
        正如我们在上面的两个例子中看到的一样,函数 os.execute 和 io.popen 都是功能非常强大的函数,但它们也同样是非常依赖于操作系统的 。
        如果要使用操作系统的其他扩展功能,最好的选择是使用第三方库, 比如用于基本目录操作和文件属性操作的 LuaFileSystem ,或者提供了 POSIX.1标准支持的 luaposix 库。

相关文章:

Lua 第7部分 输入输出

由于 Lua 语言强调可移植性和嵌入性 , 所以 Lua 语言本身并没有提供太多与外部交互的机制 。 在真实的 Lua 程序中,从图形、数据库到网络的访问等大多数 I/O 操作,要么由宿主程序实现,要么通过不包括在发行版中的外部库实现。 单就…...

Java 中 == 和 equals() 的区别

1. 运算符 是 Java 中的比较运算符,用于比较两个变量的值是否相等,但具体行为取决于变量的类型: 类型 比较的内容基本类型直接比较值是否相等(如 int a 5; int b 5; a b 返回 true)引用类型比较内存地址&#x…...

Redis新节点加入集群会发生什么(面试题)

新加入主节点:会发生槽位数据重新分配迁移, 新加入从节点,会发生主从同步,全量同步和增量同步 当一个新节点加入 Redis 集群时,会触发一系列操作以确保集群的稳定性和数据的一致性。以下是新节点加入 Redis 集群时的详…...

dmncdm达梦新云缓存数据库主从集群安装部署详细步骤说明

dmncdm达梦新云缓存数据库主从集群安装部署详细步骤说明 1 环境介绍2 安装部署dmncdm2.1 196部署cdm环境2.2 197部署cdm环境2.3 190部署cdm环境 3 主备集群/主从集群配置4 部署主备集群/主从集群5 部署日志6 更多达梦数据库全方位指南:安装 优化 与实战教程 1 环境介绍 cpu x8…...

docker容器,mysql的日志文件怎么清理

访问问题 你的问题是因为在当前路径 /home/ictrek/data/ragflow-mysql 下没有名为 data 的子目录。以下是详细分析和解决方法: 错误原因 路径不存在 当前目录 /home/ictrek/data/ragflow-mysql 下没有名为 data 的子目录,执行 cd data/ 时会报错 No suc…...

kafka auto.offset.reset详解

在 Kafka 中,auto.offset.reset latest 的含义及行为如下: 1. ​​核心定义​​ 当消费者组​​首次启动​​或​​无法找到有效的 offset​​(例如 offset 过期、被删除或从未提交)时,消费者会从分区的​​最新位置…...

设备制造行业如何避免项目管理混乱?

项目常因进度延误、成本超支或部门协作不畅而陷入混乱? 这不仅拖累项目交付,还可能损害客户信任和企业利润。设备制造行业的项目管理复杂多变,从需求获取到生产交付再到售后运维,每一个环节都可能成为效率的瓶颈。 如何破解这一…...

kubernetes》》k8s》》删除命名空间

使用 kubectl delete ns 命名空间 --force --grace-period0 如果还删除不掉 需要 kubectl get namespace 命名空间 -o json > x.json vim x.json kubectl replace --raw “/api/v1/namespaces/命名空间/finalize” -f ./x.json...

【深度学习新浪潮】新视角生成的研究进展调研报告(2025年4月)

新视角生成(Novel View Synthesis)是计算机视觉与图形学领域的核心技术,旨在从单张或稀疏图像中生成任意视角的高保真图像,突破传统多视角数据的限制,实现对三维场景的自由探索。作为计算机视觉与图形学的交叉领域,近新视角生成年来在算法创新、应用落地和工具生态上均取…...

55、Spring Boot 详细讲义(十一 项目实战)springboot应用的登录功能和权限认证

项目文档:springboot应用的登录功能和权限认证 一、项目概述 1. 项目简介 本项目是在一个基于Spring Boot的Web应用中实现登录功能和权限认证。要求实现登录功能,用户登录成功以后,会给前台返回当前登录用户可以访问的权限菜单,比如超级管理员可以访问所有权限,产品管理…...

react 父子组件通信 子 直接到父, 父 forwardref子

React核心概念:单向数据流(Unidirectional Data Flow) React 中数据的流动像瀑布一样,只能从上层组件(父组件)流向下层组件(子组件)。 子组件无法直接反向修改父组件的数据&#x…...

基于TCP的协议

目录 TCP 基于TCP的应用层协议: TCP的工作方式 TCP TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。它为应用层提供了一个可靠的端到端的数据传输服务。再TCP/IP模型中,TCP位于传输层,负责再…...

性能比拼: Go vs Java

本内容是对知名性能评测博主 Anton Putra Go (Golang) vs Java: Performance Benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本视频中,我们将比较 Go 和 Java。 我们将基于 Golang 的 Fiber 框架和 Java 的 Spring Boot 创建几个简单的应用…...

【Spring】单例作用域下多次访问同一个接口

在Spring框架中,Controller和Service的Bean默认都是单例(Singleton)的。在多个请求同时访问Controller时,Service的Bean调用情况如下: 1. 核心机制 单例Bean:Spring容器为每个Bean定义(如Serv…...

数据库介绍

1、什么是数据库 数据库是一个“广义的概念" 1. 表示一门学科 2. 表示一类软件,管理数据的软件 3. 表示某一个具体的数据库软件 4. 表示部署了某个数据库软件的主机(电脑) 本专栏介绍的是具体的数据库软件:MySQL 数据库软件的主要功能是对数据的增删…...

Spring XML 配置

Spring XML 配置是 Spring Framework 的传统配置方式&#xff0c;通过 XML 文件定义 Bean、依赖注入、AOP 等核心功能。以下是详细的 Spring XML 配置解析&#xff1a; 一、基础配置 1. XML 配置文件结构 <?xml version"1.0" encoding"UTF-8"?> …...

AI数字人:品牌营销的新宠与增长密码(6/10)

摘要&#xff1a;AI数字人凭借低成本、高可控性与强互动性等优势&#xff0c;正成为品牌营销新宠。通过技术驱动&#xff0c;AI数字人从虚拟形象发展为智能交互的数字化身&#xff0c;广泛应用于直播、客服、内容生产等营销场景&#xff0c;助力品牌提升营销效果与用户互动体验…...

CentOS笔记本合上盖子不休眠

通过修改 /etc/systemd/logind.conf 文件中的 HandleLidSwitch 和 HandleLidSwitchDocked 设置为 ignore&#xff0c;可以实现合上笔记本盖子时不休眠的效果。如果有其他电源管理工具或桌面环境的设置干扰&#xff0c;也需要一并调整。 // 切换到root用户 su root// logind.co…...

Vue.js 之 `v-for` 命令详解

Vue.js 之 v-for 命令详解 在 Vue.js 中&#xff0c;v-for 是一个非常强大的指令&#xff0c;用于遍历数组或对象中的数据&#xff0c;并渲染相应的 DOM 元素。无论是在列表展示、表单生成还是动态组件加载中&#xff0c;v-for 都发挥着重要作用。本文将详细介绍 v-for 的用法…...

Linux命令-pidstat

pidstat命令是一个用于监控系统中各个进程活动的性能监控工具。它能够实时输出每个进程的 CPU、内存、I/O 等关键性能指标。以下是关于 pidstat 命令的详细介绍&#xff1a; 语法 pidstat [选项] [时间间隔] [次数]常用选项 -h 或 --help &#xff1a;显示帮助信息。 -v &…...

map和set

1.序列式容器和关联式容器 在认识map和set之前&#xff0c;关于容器&#xff0c;有两个重要的分类 序列式容器关联式容器 序列式容器&#xff1a;按照元素插入的顺序保存数据&#xff0c;关注元素的顺序和位置&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位…...

CentOS 6.9 安装 Zabbix 3.0 详细教程

一、引言 在 Linux 环境下&#xff0c;有许多实用的系统监控软件&#xff0c;如 Nagios、Cacti、Zabbix、Monit等。这些开源软件能帮助我们更好地管理机器&#xff0c;及时发现问题并警告系统维护人员。今天我们将重点研究 Zabbix&#xff0c;使用它的目的是为了更好地监控MySQ…...

通俗的理解TCP的三次握手四次挥手

前言 本文是博主根据自身理解&#xff0c;尽量用最通俗的形式解释TCP的三次握手四次挥手。 一、三次握手&#xff1a;为什么不是两次或四次&#xff1f; 1. 三次握手过程 SYN&#xff1a;客户端发送SYN1, seqx&#xff08;我要连接&#xff09;SYNACK&#xff1a;服务器回复…...

【Python进阶】正则表达式实战指南:从基础到高阶应用

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1&#xff1a;邮箱格式验证案例2&#xff1a;提取电话号码案例3&#xff1a;替换敏感信息 运行…...

linux下内存地址数学运算

如下代码计算地址并16字节对齐&#xff1a; char* buffer (char*)malloc(a3 0x1000);unsigned long long tmp (((unsigned long long)buffer 0x10) & 0xffffffffffffff00);char* buf (char*)tmp;假如把地址当作整数&#xff0c;加减程序运算&#xff0c;直接转换是不行…...

考研单词笔记 2025.04.22

abuse v/n滥用&#xff0c;妄用&#xff0c;虐待&#xff0c;伤害 adopt v采用&#xff0c;采纳&#xff0c;收养&#xff0c;领养&#xff0c;正式通过&#xff0c;批准 apply v应用&#xff0c;运用&#xff0c;申请&#xff0c;适用&#xff0c;有效 deploy v有效利用&am…...

JVM虚拟机-类加载器、双亲委派模型、类装载的执行过程

一、什么是类加载器&#xff0c;类加载器有哪些 我们目前要讲的就是类加载子系统&#xff0c;主要作用是将java源码编译为class字节码文件后装载到运行时数据区&#xff0c;运行时数据区就可以去分配内存再通过执行引擎来执行java代码。 启动类加载器(也称引导类加载器)&…...

神经网络的 “成长密码”:正向传播与反向传播深度解析(四)

引言 在神经网络的神秘世界里&#xff0c;正向传播和反向传播是驱动模型学习和进化的核心机制。它们如同神经网络的 “左右脑”&#xff0c;正向传播负责信息的前向流动与初步处理&#xff0c;反向传播则通过优化权重参数来提升模型性能&#xff0c;二者相辅相成&#xff0c;共…...

激活函数:神经网络的 “魔法开关”,开启智能之门(三)

引言 在神经网络的复杂架构中&#xff0c;激活函数扮演着至关重要的角色&#xff0c;堪称神经网络的 “魔法开关”。它赋予了神经网络强大的能力&#xff0c;让其能够处理各种复杂的任务。本文将深入剖析激活函数的重要性、引入原因、常见类型以及选择策略&#xff0c;并针对面…...

服装印花/印烫环节计算机视觉应用设计方案

服装印花/印烫环节计算机视觉应用设计方案 一、引言 随着消费者对服装个性化、多样化需求的增加&#xff0c;服装印花/印烫环节作为服装生产中的重要一环&#xff0c;其质量和效率直接影响到产品的竞争力和市场占有率。传统的服装印花/印烫环节存在以下痛点&#xff1a; 人为…...

vue3:十一、主页面布局(修改左侧导航条的样式)

一、样式 1、初始样式 2、 左侧导航栏搭建完成样式 二、实现 1、设置左侧导航栏底色 (1)去掉顶部和左侧导航栏的底色 初始页面效果 顶部与左侧底色样式 将代码中与顶部与左侧的样式删掉 移除后页面效果 加入设定背景色 #f4f6f9 加入底色后颜色展示 (2)去除菜单项底色 初…...

Sentinel源码—8.限流算法和设计模式总结二

大纲 1.关于限流的概述 2.高并发下的四大限流算法原理及实现 3.Sentinel使用的设计模式总结 3.Sentinel使用的设计模式总结 (1)责任链模式 (2)监听器模式 (3)适配器模式 (4)模版方法模式 (5)策略模式 (6)观察者模式 (1)责任链模式 一.责任链接口ProcessorSlot 二.责…...

Docker 部署 MySQL 数据库

Docker 部署 MySQL 数据库 基于 Docker 部署 MySQL 数据库一、拉取 MySQL 镜像二、运行 MySQL 容器三、运行命令参数详解四、查看容器运行状态 基于 Docker 部署 MySQL 数据库 一、拉取 MySQL 镜像 在开始之前&#xff0c;请确保你的 Docker 环境已经正确安装并可以正常运行。…...

【Linux运维涉及的基础命令与排查方法大全】

文章目录 前言1、计算机网络常用端口2、Kali Linux中常用的命令3、Kali Linux工具的介绍4、Ubuntu没有网络连接解决方法5、获取路由6、数据库端口 前言 以下介绍计算机常见的端口已经对应的网络协议&#xff0c;Linux中常用命令&#xff0c;以及平时运维中使用的排查网络故障的…...

映射(Mapping)和地址(Address)

Addresses &#xff08;地址&#xff09; 以太坊区块链由 _ account _ (账户)组成&#xff0c;你可以把它想象成银行账户。一个帐户的余额是 以太 &#xff08;在以太坊区块链上使用的币种&#xff09;&#xff0c;你可以和其他帐户之间支付和接受以太币&#xff0c;就像你的银…...

用Java实现简易区块链:从零开始的探索

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 区块链技术作为近年来的热门话题&am…...

Spark-Streaming

Spark-Streaming 一、Spark-Streaming简介 1、Spark-Streaming概述 1.1、Spark-Streaming是什么 Spark Streaming 用于流式数据的处理。Spark Streaming 支持的数据输入源很多&#xff0c;例如&#xff1a;Kafka、Flume、Twitter等&#xff0c;以及和简单的 TCP 套接字等等…...

工程投标k值分析系统(基于微服务实现)

1 需求总括 2 企业管理模块: 新增、删除、修改企业/部门 <...

WebGL 工作原理

WebGL在GPU上的工作基本上分为两部分 第一部分是将顶点&#xff08;或数据流&#xff09;转换到裁剪空间坐标 就是将传入的位置坐标&#xff0c;转换为0-1的值&#xff0c;并绘制出来每个顶点的坐标&#xff08;传入的值&#xff09;通过顶点着色器计算转换为裁剪空间坐标转换…...

【 React 】重点知识总结 快速上手指南

react 是 facebook 出的一款针对视图层的库。react 使用的是单向数据流的机制 React 官方中文文档 基础 api 和语法 jsx 语法 就是在 js 中插入 html 片段 在 React 中所有的组件都是 function 组件定义 function 定义组件 就是使用 function 定义组件 任何一个 function …...

Docker 部署 Redis 缓存服务

Docker 部署 Redis 缓存服务 基于 Docker 部署 Redis 缓存服务一、拉取 Redis 镜像二、运行 Redis 容器三、运行命令参数详解四、查看容器运行状态 基于 Docker 部署 Redis 缓存服务 一、拉取 Redis 镜像 确保 Docker 环境已正确安装并运行&#xff0c;打开终端执行以下命令拉…...

A2A + MCP:构建实用人工智能系统的超强组合

构建真正有效的连接型人工智能系统的挑战 如果你正在构建人工智能应用&#xff0c;这种情况可能听起来很熟悉&#xff1a; 你需要特定的人工智能能力来解决业务问题。你找到了完成每个单独任务的出色工具。但把所有东西连接在一起却占据了大部分开发时间&#xff0c;还创建了…...

全能 Sui 技术栈,构建 Web3 的未来

本文翻译自&#xff1a;FourPillarsFP&#xff0c;文章仅代表作者观点。 2025 年&#xff0c;SuiNetwork正在以一套全栈区块链策略强势出击&#xff0c;彻底打破加密行业的传统范式。正如 Mysten Labs 联合创始人 Adeniyi Abiodun 所说&#xff1a;“Sui 不只是一条区块链&…...

企业微信私域运营,基于http协议实现SCRM+AI完整解决方案

1、方案介绍 基于企业微信原生功能已实现全场景的能力覆盖&#xff0c;并提供标准化可直接调用的API接口&#xff0c;可以帮助企业轻松实现上层应用的开发及落地&#xff0c;方案采用模拟通信技术可实现PC&#xff0c;手机&#xff0c;ipad三端的同时在线&#xff0c;单服务器…...

【C++】Json-Rpc框架项目介绍(1)

项目介绍 RPC&#xff08;Remote Procedure Call&#xff09;即远程过程调用&#xff0c;是一种通过网络从远程计算机程序中请求服务而不需要了解底层网络实现细节的一种 协议 。 RPC&#xff08;Remote Procedure Call&#xff09;可以使用多种网络协议进行通信&#xff0c;如…...

数据结构图论基础知识(一)

文章目录 1. 图的基本概念2. 图的一些现实的应用2.1 ABCDE各个城市之间的关系2.2 社交关系 3. 图的存储结构3.1邻接矩阵3.2 邻接矩阵的实现3.3 邻接表 1. 图的基本概念 1. &#xff08;graph&#xff09;图由边&#xff08;edge&#xff09;和顶点&#xff08;Vertex&#xff…...

安宝特案例 | AR如何大幅提升IC封装厂检测效率?

前言&#xff1a;如何提升IC封装厂检测效率&#xff1f; 在现代电子产品的制造过程中&#xff0c;IC封装作为核心环节&#xff0c;涉及到复杂处理流程和严格质量检测。这是一家专注于IC封装的厂商&#xff0c;负责将来自IC制造商的晶圆进行保护、散热和导通处理。整个制程繁琐…...

2024年ESWA SCI1区TOP:量子计算蜣螂算法QHDBO,深度解析+性能实测

目录 1.摘要2.蜣螂优化算法DBO原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 蜣螂优化算法是一种群体智能优化算法&#xff0c;具有较强的优化能力和快速收敛性&#xff0c;但容易在优化过程后期陷入局部最优解。本文提出了一种量子计算和多策略混合的蜣螂优化算法&am…...

数据结构*链表- LinkedList

什么是链表 相较于ArrayList顺序表来说&#xff0c;链表是物理存储结构上非连续存储结构&#xff08;也就是地址不是连续的&#xff09;。链表由一系列节点构成&#xff0c;每个节点包含数据和指向下一个节点的引用。链表的各个节点在内存里并非连续存储&#xff0c;而是通过引…...

WebRTC服务器Coturn服务器用户管理和安全性

1、概述 Coturn服务器对用户管理和安全方面也做了很多的措施&#xff0c;以下会介绍到用户方面的设置 1.1、相关术语 1.1.1 realm 在 coturn 服务器中&#xff0c;域&#xff08;realm&#xff09;是一种逻辑上的分组概念&#xff0c;用于对不同的用户群体、应用或者服务进行区…...