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+”

启用读取模式的追加模式可打开现有文件或创建新文件。

隐式文件描述符

隐式文件描述符使用标准输入/输出模式或使用单个输入和单个输出文件。下面显示了使用隐式文件描述符的示例。

-- Opens a file in read
file = io.open("test.lua", "r")

-- sets the default input file as test.lua
io.input(file)

-- prints the first line of the file
print(io.read())

-- closes the open file
io.close(file)

-- Opens a file in append mode
file = io.open("test.lua", "a")

-- sets the default output file as test.lua
io.output(file)

-- appends a word test to the last line of the file
io.write("-- End of the test.lua file")

-- closes the open file
io.close(file)

当您运行该程序时,您将获得 test.lua 文件第一行的输出。对于我们的程序,我们得到以下输出。

-- Sample test.lua

这是我们 test.lua 文件中语句的第一行。另外,“--End of the test.lua file”行将被附加到 test.lua 代码的最后一行。

在上面的示例中,您可以看到隐式描述符如何使用 io."x" 方法与文件系统一起工作。上面的示例使用 io.read() ,不带可选参数。可选参数可以是以下任意一个。

先生。 模式及说明
1

“*n”

从当前文件位置读取,如果文件位置存在则返回一个数字,否则返回 nil。

2

“*A”

从当前文件位置返回文件的所有内容。

3

“*l”

从当前文件位置读取行,并将文件位置移动到下一行。

4

数字

读取函数中指定的字节数。

其他常见的 I/O 方法包括:

  • io.tmpfile() - 返回一个用于读写的临时文件,程序退出后将被删除。

  • io.type(file) - 根据输入文件返回文件、关闭文件还是 nil。

  • io.flush() - 清除默认输出缓冲区。

  • io.lines(可选文件名) - 提供通用的for循环迭代器,循环遍历文件并最终关闭文件,以防提供文件名或使用默认文件且在循环结束时未关闭。

显式文件描述符

我们经常使用显式文件描述符,它允许我们一次操作多个文件。这些函数与隐式文件描述符非常相似。在这里,我们使用 file:function_name 而不是 io.function_name。下面显示了相同隐式文件描述符示例的文件版本示例。

-- Opens a file in read mode
file = io.open("test.lua", "r")

-- prints the first line of the file
print(file:read())

-- closes the opened file
file:close()

-- Opens a file in append mode
file = io.open("test.lua", "a")

-- appends a word test to the last line of the file
file:write("--test")

-- closes the open file
file:close()

当您运行该程序时,您将获得与隐式描述符示例类似的输出。

-- Sample test.lua

外部描述符的所有文件打开模式和读取参数与隐式文件描述符相同。

其他常见的文件方法包括,

  • file:seek(可选whence, 可选offset) -whence参数为“set”、“cur”或“end”。使用从文件开头开始的更新文件位置设置新文件指针。该函数中的偏移量是从零开始的。如果第一个参数是“set”,则偏移量是从文件的开头开始测量的;如果是“cur”,则从文件中的当前位置开始;或者从文件末尾开始(如果是“结束”)。默认参数值为“cur”和0,因此可以通过不带参数调用此函数来获取当前文件位置。

  • file:flush() - 清除默认输出缓冲区。

  • io.lines(可选文件名) - 提供通用的for循环迭代器,循环遍历文件并最终关闭文件,以防提供文件名或使用默认文件且在循环结束时未关闭。

下面显示了使用查找方法的示例。它将光标从文件末尾之前的 25 个位置偏移。读取函数从查找位置打印文件的其余部分。

-- Opens a file in read
file = io.open("test.lua", "r")

file:seek("end",-25)
print(file:read("*a"))

-- closes the opened file
file:close()

您将得到一些类似于以下内容的输出。

sample2 test.lua
--test

您可以尝试所有不同的模式和参数,以了解 Lua 文件操作的全部能力。