Lua I/O 库用于读取和处理文件。分为简单模式、完全模式。
简单模式(simple model):拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。
完全模式(complete model) :使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件操作定义为文件句柄的方法。
打开文件操作语句如下:
file = io.open(filename [, mode])
【mode】:
简单模式使用标准的 I/O 或使用一个当前输入文件和一个当前输出文件。
file = io.open('a.txt', 'r')
io.input(file)
print(io.read()) -- a.txt读入第一行
io.close(file)
file = io.open('a.txt', 'r')
io.output(file)
io.write("lua") -- 输出定向到文件a.txt中
io.close(file)
io.read()
参数:
代码演示:
file = io.open('./a.txt', 'w')
io.output(file)
io.write('zzz\n')
io.write('111\n')
io.write('222\n')
io.write('aaa\n')
io.close(file) -- 保证数据写入file
a.txt:
zzz
111
222
aaa
file = io.open('./a.txt', 'r')
io.input(file)
print("read('*n')", io.read('*n'))
io.close(file)
运行输出;
read('*n') nil
如果a.txt
文件第一行是数字开头(例:12x),那么会读完数字(输出:12)。
file = io.open('./a.txt', 'r')
io.input(file)
print("read('*a')", io.read('*a'))
io.close(file)
运行输出:
read('*a') zzz
111
222
aaa
其他的 io 方法有:
io.tmpfile():返回一个临时文件句柄,该文件以更新模式打开,程序结束时自动删除。
io.type(file):检测obj是否一个可用的文件句柄。
io.flush():向文件写入缓冲中的所有数据。
io.lines(optional file name):返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回 nil,但不关闭文件。
原型:io.lines ([filename])
解释:按文件名以读的模式打开一个文件,并且返回一个迭代函数。这个迭代函数每一次被调用都会返回文件中新的一行的内容,直到文件中所有的内容都被读完。当迭代函数检测到文件末尾时,它会返回nil来结束循环并自动关闭文件。
for line in file do print(line) end
local file = io.lines('./a.txt')
print(file())
print(file())
print(file())
print(file())
print(file()) -- nil or 空
-- 到此文件已经自动关闭
-- io.close(file) or file() 都会报错!
通常我们需要在同一时间处理多个文件。我们需要使用 file:function_name 来代替 io.function_name 方法。
lines
函数还有另一种表现形式:file:lines()
。
如果设置了io.input(file)
,那么这样就等价于:io.input():lines()
。
file = io.open('./a.txt')
for line in file:lines() do print(line) end
io.close()
file = io.open('./a.txt')
io.input(file)
for line in io.input():lines() do print(line) end
io.close()
read 的参数与简单模式一致。
其他方法:
file:seek(optional whence, optional offset):设置和获取当前文件位置,成功则返回最终的文件位置(按字节),失败则返回nil加错误信息。参数【whence】:
不带参数file:seek()
则返回当前位置;
file:seek("set")
则定位到文件头;
file:seek("end")
则定位到文件尾并返回文件大小;
a.txt
zzz
111
222
aaa
local file = io.open('./a.txt')
file:seek('end', -10)
print(file:read('*a'))
file:close()
运行输出:
1
222
aaa