一 Lua中的I/O体现
'图形-->graph'、'数据库-->database'、'网络-->network'的访问 --> 与'外部交互'的机制
+++++++++++++++'I/O实现方式'+++++++++++++++
1)由'宿主程序'实现
2)'不包括'在发行版中的'外部库实现'
备注:Lua语言只'提供了ISO C语言标准支持'的功能,即'基本的文件操作'
二 Lua关于I/O常见的函数
三 I/O模型
I/O库为文件操作提供了'两种不同的模型','简单'模型和'完整'模型
(1)简单I/O模型
特点:虚拟了一个'当前输入流'和一个'当前输出流',I/O操作是通过这些流'实现'的
函数'io.input'和'io.output'可以用于'改变当前'的输入输出流
简单模式:'所有操作'会在2个当前文件 -->默认为'标准输入stdin','标准输出stdout'
① read
从'当前输入流中'读取字符串,其'参数'决定了'要读取的数据'
-- 默认从'stdin'读取
local t = io.read('*n')
--'*a' 一次性地读取整个文件 --> '常用'
--'*l' 读取下一行('不包括换行符')=io.read() -->'默认参数' -->返回'当前输入流的下一行'
--'*L' 读取下一行(包括换行符)
--'*n' 读取一个'数字'(非数字开头返回nil,数字开头直到'读到非数字')
--num 读取'num个字符'
备注:'5.2及更'早版本,所有字符串选项之前'要有一个星号',处于'兼容性',Lua5.3也可以'支持星号'
(2)完整I/O模型
需要在'同一时间处理多个文件',我们需要使用 'file:function_name' 来代替'io.function_name' 方法
① open
filename:'待打开'文件的'文件名'
io.open返回'对应文件'的流
特点:打开文件,返回'文件句柄'
+++++++++++++++'发生错误'+++++++++++++++
1)函数会'返回nil'
2)返回一条'错误信息'
3)同时返回一个'系统相关的错误码'
② read
功能:使用方法'read'从流中'读取'
特点:使用'冒号运算符-->:'将它们当作'流对象的方法'来调用
file:read(args)
io.read(0)是一个'特例',它常用于测试是'否到达了文件的末尾',如果'不是'则返回'空字符串',如果是末尾'则返回nil'
+++++++++++++'参数解读'+++++++++++++
--'*a' 一次性地读取整个文件 --> '常用'
--'*l' 读取下一行('不包括换行符')=io.read() -->'默认参数' -->返回'当前输入流的下一行'
--'*L' 读取下一行(包括换行符)
--'*n' 读取一个'数字'(非数字开头返回nil,数字开头直到'读到非数字')
--num 读取'num个字符'
+++++++++++'案例讲解'+++++++++++
1)'打开'一个文件
2)'读取'文件的内容
3)'关闭'流
调用io.input(),它会以'只读方式'打开一个文件,并将文件内容设置为'当前输入流'
③ write
④ seek
特点:函数seek用来'获取和设置文件'的当前位置
f:seek("end",-1) --定位到'文件末尾前一个字节'
需求:不修改当前位置的情况下获取文件的大小
⑤ lines
返回一个可以从'流中不断读取'内容的'迭代器'
+++++++++++++++'分割线'+++++++++++++++
io.lines(filename)
说明:会以'只读'方式打开'对应该文件'的输入流,并在'到达文件末尾后'关闭该输入流
⑥ flush
file:flush(): 向文件'写入缓冲中'的所有数据 --> io.flush函数会将'io缓存中'的数据'刷新'到磁盘文件上
-- '刷新缓冲区'
-- 一般为了'性能'考虑,当向文件'写入一段'数据时',不会立刻写入',而是'先'
-- 缓存到'内存缓冲区',然后当'满足某个条件'或显示调用file:flush()时
-- 才会立即把'缓冲区的数据写入磁盘'-->也即'文件中'
需求:临时改变当前输入流
local temp = io.input() --保存当前的输入文件句柄
io.input('temp.txt') --打开新文件并设置为当前文件句柄
-- do something -->'对新的输入流进行某些操作'
io.input():close() --关闭当前流
io.input(temp) --'恢复'此前的'当前输入流'
备注: I/O库还提供了'3个预定义'的'文件句柄',即io.stdin('标准输入')、io.stdout('标准输出')、io.stderr('标准错误输出')
io.write(args) '==' io.output():write(args) --> '简写'
需求:以块为迭代
由于'一次性读取整个文件'比'逐行读取'要快一些,但对于'较大的文件',这样'并不可行'
因此Lua提供了'一种折中'的方式:即一次'读取指定字节数量'的数据,如果当前读取中的最后一行'不是完整'的一行,可通过该方式将该行的'剩余部分也一并读入',从而'保证'本次读取的数据均为整行数据,以便于'上层逻辑'的处理
++++++++'以8KB为块迭代'++++++++
local BUFSIZE = 8096
local f = io.input(arg[1]) --'打开输入文件'
local lines,rest = f:read(BUFSIZE,"*line") --rest变量包含最后一行中没有读取的部分
⑦ assert
'assert'(io.open(filename,mode)) --如果'打开失败',assert将'打印第二个参数'给出的'错误信息'
⑧ setvbuf
特点:设置流的'缓冲模式'
file:setvbuf(mode[, size])
-- 设置'缓冲模式'
-- 'no' 不缓冲直接写入(不推荐,除非在开发调试阶段)
-- 'full' 全缓冲,只有当缓冲区满了的时候才会立即写入
-- 'line' 行缓冲,遇到换行符的时候立即写入
-- 当显示调用file:flush()就会立即写入
⑨ tmpfile
特点:返回一个'操作临时文件的句柄',该句柄以'读/写'模式打开
特点:当'程序结束后',该'临时文件'会被'自动移除'(删除)
四 系统调用
五 最佳实践