Lua基础(十)输入输出

一  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

特点:返回一个'操作临时文件的句柄',该句柄以'读/写'模式打开

特点:当'程序结束后',该'临时文件'会被'自动移除'(删除)

四  系统调用

五  最佳实践

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值