Lua - 文件 I/O
I/O 库用于在 Lua 中读取和操作文件。 Lua 中有两种文件操作,即隐式文件描述符和显式文件描述符。
对于以下示例,我们将使用示例文件 test.lua,如下所示。
-- sample test.lua -- sample2 test.lua
一个简单的文件打开操作使用以下语句。
file = io.open (filename [, mode])
下表列出了各种文件模式。
序号 | 模式 & 描述 |
---|---|
1 | "r" 只读模式,是打开现有文件的默认模式。 |
2 | "w" 覆盖现有文件或创建新文件的写入启用模式。 |
3 | "a" 追加模式,打开现有文件或创建新文件以进行追加。 |
4 | "r+" 现有文件的读写模式。 |
5 | "w+" 如果文件存在或创建具有读写权限的新文件,则删除所有现有数据。 |
6 | "a+" 启用读取模式的追加模式可打开现有文件或创建新文件。 |
隐式文件描述符
隐式文件描述符使用标准输入/输出模式或使用单个输入和单个输出文件。 使用隐式文件描述符的示例如下所示。
-- 以读取方式打开文件 file = io.open("test.lua", "r") -- 将默认输入文件设置为 test.lua io.input(file) -- 打印文件的第一行 print(io.read()) -- 关闭打开的文件 io.close(file) -- 以追加模式打开文件 file = io.open("test.lua", "a") -- 将默认输出文件设置为 test.lua io.output(file) -- 将单词测试附加到文件的最后一行 io.write("-- End of the test.lua file") -- 关闭打开的文件 io.close(file)
当你运行程序时,你会得到 test.lua 文件第一行的输出。 对于我们的程序,我们得到以下输出。
-- Sample test.lua
这是我们 test.lua 文件中语句的第一行。 此外,"-- test.lua 文件的结尾"行将附加到 test.lua 代码的最后一行。
在上面的示例中,您可以看到隐式描述符如何使用 io."x" 方法与文件系统一起工作。 上面的示例使用 io.read() 没有可选参数。 可选参数可以是以下任何一种。
序号 | 模式 & 描述 |
---|---|
1 | "*n" 从当前文件位置读取,如果文件位置存在则返回一个数字或返回 nil。 |
2 | "*a" 从当前文件位置返回文件的所有内容。 |
3 | "*l" 从当前文件位置读取该行,并将文件位置移动到下一行。 |
4 | number 读取函数中指定的字节数。 |
其他常见的 I/O 方法包括:
io.tmpfile() − 返回一个用于读写的临时文件,一旦程序退出,该文件将被删除。
io.type(file) − 根据输入文件返回文件、关闭文件还是 nil。
io.flush() − 清除默认输出缓冲区。
io.lines(optional file name) − 提供一个通用的 for 循环迭代器,它循环遍历文件并最终关闭文件,以防提供文件名或使用默认文件但未在循环结束时关闭。
显式文件描述符
我们经常使用显式文件描述符,它允许我们一次操作多个文件。 这些函数与隐式文件描述符非常相似。 在这里,我们使用 file:function_name 而不是 io.function_name。 下面显示了相同隐式文件描述符示例的文件版本示例。
-- 以读取模式打开文件 file = io.open("test.lua", "r") -- 打印文件的第一行 print(file:read()) -- 关闭打开的文件 file:close() -- 以追加模式打开文件 file = io.open("test.lua", "a") -- 将单词测试附加到文件的最后一行 file:write("--test") -- 关闭打开的文件 file:close()
运行程序时,您将获得与隐式描述符示例类似的输出。
-- Sample test.lua
外部描述符的所有文件打开模式和读取参数与隐式文件描述符相同。
其他常见的文件方法包括,
file:seek(optional whence, optional offset) − 其中参数是"set"、"cur"或"end"。 使用从文件开头更新的文件位置设置新文件指针。 此函数中的偏移量从零开始。 如果第一个参数是"set",则偏移量从文件的开头开始测量; 如果它是"cur",则从文件中的当前位置开始; 或者如果它是"end",则从文件末尾开始。 默认参数值为"cur"和0,因此可以通过不带参数调用此函数来获得当前文件位置。
file:flush() − 清除默认输出缓冲区。
io.lines(optional file name) − 提供一个通用的 for 循环迭代器,它循环遍历文件并最终关闭文件,以防提供文件名或使用默认文件但未在循环结束时关闭。
使用 seek 方法的示例如下所示。 它将光标从文件结尾之前的 25 个位置偏移。 读取函数从查找位置打印文件的其余部分。
-- 以读取方式打开文件 file = io.open("test.lua", "r") file:seek("end",-25) print(file:read("*a")) -- 关闭打开的文件 file:close()
您将获得类似于以下内容的一些输出。
sample2 test.lua --test
您可以玩转所有不同的模式和参数,以了解 Lua 文件操作的全部能力。