在Lua里面,读取文件分两个模式:简单模式 和 完全模式。
简单模式:拥有当前一个读入文件和读出文件,在Lua I/O库里面提供相关的一些简单的操作。
完全模式:使用文件的句柄对文件进行操作。
区别在于:简单模式中对文件的操作比较少,适合对单一的文件做处理。如果我们同时对多个文件进行处理的,就需要使用我们的完全模式。
打开文件的模式(mode)有很多种:
r | 以只读方式打开文件,该文件必须存在。 |
w | 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 |
a | 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留) |
r+ | 以可读写方式打开文件,该文件必须存在。 |
w+ | 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 |
a+ | 与a类似,但此文件可读可写 |
b | 二进制模式,如果文件是二进制文件,可以加上b |
+ | 号表示对文件既可以读也可以写 |
Lua的 I/O里面提供的接口大多都是两个参数:第一个就是我们需要操作的文件,第二个就是我们表中介绍的模式
简单模式
现在我们在file.lua 里面操作test.lua文件
--注意test.lua文件的路径
--“./test.lua”表示当前路径
--"../test.lua"表示当前路径的上一级路径
--因为我的.lua文件放在Lua解析器的上一级目录,所以我需要使用"../test.lua"
--因为我们第一次打开文件的模式使用的是:'r',所以文件必须存在,如果没有我们需要自己提前创建
-- 以只读方式打开文件
file = io.open("test.lua", "r")
-- 设置默认输入文件为 test.lua
io.input(file)
--如果我们创建的文件里面没有任何的内容,那就是:nil
-- 输出文件第一行
print(io.read())
-- 关闭打开的文件
io.close(file)
--'a'模式打开文件,如果没有文件则会创建,如果有,那么写入数据就会在文件的末尾
-- 以附加的方式打开只写文件
file = io.open("test.lua", "a")
-- 设置默认输出文件为 test.lua
io.output(file)
-- 在文件最后一行添加 Lua 注释
io.write("-- test.lua 文件末尾注释")
-- 关闭打开的文件
io.close(file)
注意:函数io.raed()没有带参数,这个函数的参数介绍如下:
" *n " | 读取一个数字并返回它。例:file.read("*n") |
" *a " | 从当前位置读取整个文件。例:file.read("*a") |
" *l "(默认) | 读取下一行,在文件尾 (EOF) 处返回 nil。例:file.read("*l") |
number | 返回一个指定字符个数的字符串,或在 EOF 时返回 nil。例:file.read(5) |
当我们执行完上面的代码,就可以打开test.lua文件看一下,里面就会有:“-- test.lua 文件末尾注释”这句话。
上面介绍的是比较常用的几个IO,还有几个IO介绍如下:
① io.tmpfile():返回一个临时文件句柄,该文件以更新模式打开,程序结束时自动删除
② io.type(file): 检测obj是否一个可用的文件句柄
③ io.flush(): 向文件写入缓冲中的所有数据
④ io.lines(optional file name): 返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回nil,但不关闭文件
完全模式
当我们需要同时对多个文件进行处理,就需要用到我们的完全模式。
代码的区别就是:一个使用io去调用接口,一个是使用文件句柄去调用接口,使用io的话就只能操作一个文件了,使用句柄的话就可以操作多个文件了,谁的句柄去掉用接口,就会去操作哪个文件。
--首先要注意的地方和之前简单模式一样就是"test.lua"文件的路径,其次就是第一次打开"test.lua"文件的模式,要注意是自己创建还是程序帮忙创建
-- 以只读方式打开文件
file = io.open("../test.lua", "r")
--file.read()的参数还是没有选择,这里面的参数和之前简单模式的参数一样,参考之前给出的read接口参数的表格就行
-- 输出文件第一行
print(file:read())
-- 关闭打开的文件
file:close()
-- 以附加的方式打开只写文件
file = io.open("../test.lua", "a")
-- 在文件最后一行添加 Lua 注释
file:write("--test")
-- 关闭打开的文件
file:close()
执行完上面的代码,在test.lua文件里面就可以看到:"-- test.lua 文件末尾注释"这句话了。
其他方法:
①:file:seek(optional whence, optional offset): 设置和获取当前文件位置,成功则返回最终的文件位置(按字节),失败则返回nil加错误信息。参数 whence 值可以是:
"set": 从文件头开始
"cur": 从当前位置开始[默认]
"end": 从文件尾开始
offset:默认为0
不带参数file:seek()则返回当前位置,file:seek("set")则定位到文件头,file:seek("end")则定位到文件尾并返回文件大小
②file:flush(): 向文件写入缓冲中的所有数据
③io.lines(optional file name): 打开指定的文件filename为读模式并返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回nil,并自动关闭文件。
若不带参数时io.lines() <=> io.input():lines(); 读取默认输入设备的内容,但结束时不关闭文件,如
for line in io.lines("main.lua") do
print(line)
end