OpenResty学习笔记(六) 文件操作
2016-06-29 10:34
330 查看
今天我们来看一下lua的文件操作。
首先,Lua I/O 库提供两种不同的方式处理文件:隐式文件描述,显式文件描述。
隐式文件描述就是设置一个默认的输入或输出文件,然后在这个文件上进行所有的输入或输出操作。所有的操作函数由 io 表提供。
而显式文件描述是使用 file:XXX() 函数方式进行操作,其中 file 为 io.open() 返回的文件句柄。
简单的理解为如果是通过io.XXX()来进行的文件操作,那就是隐式的,如果是对过file:XXX()来进行文件操作的,那就是显示的,具体什么区别现在还不太清楚,如果有能讲明白的请在评论里留一下言,如果什么时候我明白了也会再回来补充的。
接下来我们说一下库函数:
1.io.open (filename [, mode])
按指定的模式 mode,打开一个文件名为filename的文件,成功则返回文件句柄,失败则返回nil加错误信息。模式:
模式字符串后面可以有一个 ‘b’,用于在某些系统中打开二进制文件。
注意 “w” 和 “wb” 的区别
“w” 表示文本文件。某些文件系统(如 Linux 的文件系统)认为 0x0A 为文本文件的换行符,Windows 的文件系统认为 0x0D0A 为文本文件的换行符。为了兼容其他文件系统(如从 Linux 拷贝来的文件),Windows 的文件系统在写文件时,会在文件中 0x0A 的前面加上 0x0D。使用 “w”,其属性要看所在的平台。
“wb” 表示二进制文件。文件系统会按纯粹的二进制格式进行写操作,因此也就不存在格式转换的问题。(Linux 文件系统下 “w” 和 “wb” 没有区别)
2.file:close ()
关闭文件。注意:当文件句柄被垃圾收集后,文件将自动关闭。句柄将变为一个不可预知的值。
3.io.close ([file])
关闭文件,和 file:close() 的作用相同。没有参数 file 时,关闭默认输出文件。
4.file:flush ()
把写入缓冲区的所有数据写入到文件 file 中。
5.io.flush ()
相当于 file:flush(),把写入缓冲区的所有数据写入到默认输出文件。
6.io.input ([file])
当使用一个文件名调用时,打开这个文件(以文本模式),并设置文件句柄为默认输入文件; 当使用一个文件句柄调用时,设置此文件句柄为默认输入文件; 当不使用参数调用时,返回默认输入文件句柄。
7.file:lines ()
返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回 nil,但不关闭文件。
8.io.lines ([filename])
打开指定的文件 filename 为读模式并返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回 nil,并自动关闭文件。若不带参数时 io.lines() 等价于 io.input():lines() 读取默认输入设备的内容,结束时不关闭文件。
9.io.output ([file])
类似于 io.input,但操作在默认输出文件上。
10.file:read (…)
按指定的格式读取一个文件。按每个格式将返回一个字符串或数字,如果不能正确读取将返回 nil,若没有指定格式将指默认按行方式进行读取。格式:
11.io.read (…)
相当于 io.input():read
12.io.type (obj)
检测 obj 是否一个可用的文件句柄。如果 obj 是一个打开的文件句柄,则返回 “file” 如果 obj 是一个已关闭的文件句柄,则返回 “closed file” 如果 obj 不是一个文件句柄,则返回 nil。
13.file:write (…)
把每一个参数的值写入文件。参数必须为字符串或数字,若要输出其它值,则需通过 tostring 或 string.format 进行转换。
14.io.write (…)
相当于 io.output():write。
15.file:seek ([whence] [, offset])
设置和获取当前文件位置,成功则返回最终的文件位置(按字节,相对于文件开头),失败则返回 nil 加错误信息。缺省时,whence 默认为 “cur”,offset 默认为 0。 参数 whence:
16.file:setvbuf (mode [, size])
设置输出文件的缓冲模式。模式:
最后两种模式,size 可以指定缓冲的大小(按字节),忽略 size 将自动调整为最佳的大小。
下面我们看一个隐式跟显式打开文件的例子:
隐式:
打开已经存在的 test1.txt 文件,并读取里面的内容
在 test1.txt 文件的最后添加一行 “hello world”
显式:
打开已经存在的 test2.txt 文件,并读取里面的内容
在 test2.txt 文件的最后添加一行 “hello world”
首先,Lua I/O 库提供两种不同的方式处理文件:隐式文件描述,显式文件描述。
隐式文件描述就是设置一个默认的输入或输出文件,然后在这个文件上进行所有的输入或输出操作。所有的操作函数由 io 表提供。
而显式文件描述是使用 file:XXX() 函数方式进行操作,其中 file 为 io.open() 返回的文件句柄。
简单的理解为如果是通过io.XXX()来进行的文件操作,那就是隐式的,如果是对过file:XXX()来进行文件操作的,那就是显示的,具体什么区别现在还不太清楚,如果有能讲明白的请在评论里留一下言,如果什么时候我明白了也会再回来补充的。
接下来我们说一下库函数:
1.io.open (filename [, mode])
按指定的模式 mode,打开一个文件名为filename的文件,成功则返回文件句柄,失败则返回nil加错误信息。模式:
模式字符串后面可以有一个 ‘b’,用于在某些系统中打开二进制文件。
注意 “w” 和 “wb” 的区别
“w” 表示文本文件。某些文件系统(如 Linux 的文件系统)认为 0x0A 为文本文件的换行符,Windows 的文件系统认为 0x0D0A 为文本文件的换行符。为了兼容其他文件系统(如从 Linux 拷贝来的文件),Windows 的文件系统在写文件时,会在文件中 0x0A 的前面加上 0x0D。使用 “w”,其属性要看所在的平台。
“wb” 表示二进制文件。文件系统会按纯粹的二进制格式进行写操作,因此也就不存在格式转换的问题。(Linux 文件系统下 “w” 和 “wb” 没有区别)
2.file:close ()
关闭文件。注意:当文件句柄被垃圾收集后,文件将自动关闭。句柄将变为一个不可预知的值。
3.io.close ([file])
关闭文件,和 file:close() 的作用相同。没有参数 file 时,关闭默认输出文件。
4.file:flush ()
把写入缓冲区的所有数据写入到文件 file 中。
5.io.flush ()
相当于 file:flush(),把写入缓冲区的所有数据写入到默认输出文件。
6.io.input ([file])
当使用一个文件名调用时,打开这个文件(以文本模式),并设置文件句柄为默认输入文件; 当使用一个文件句柄调用时,设置此文件句柄为默认输入文件; 当不使用参数调用时,返回默认输入文件句柄。
7.file:lines ()
返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回 nil,但不关闭文件。
8.io.lines ([filename])
打开指定的文件 filename 为读模式并返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回 nil,并自动关闭文件。若不带参数时 io.lines() 等价于 io.input():lines() 读取默认输入设备的内容,结束时不关闭文件。
9.io.output ([file])
类似于 io.input,但操作在默认输出文件上。
10.file:read (…)
按指定的格式读取一个文件。按每个格式将返回一个字符串或数字,如果不能正确读取将返回 nil,若没有指定格式将指默认按行方式进行读取。格式:
11.io.read (…)
相当于 io.input():read
12.io.type (obj)
检测 obj 是否一个可用的文件句柄。如果 obj 是一个打开的文件句柄,则返回 “file” 如果 obj 是一个已关闭的文件句柄,则返回 “closed file” 如果 obj 不是一个文件句柄,则返回 nil。
13.file:write (…)
把每一个参数的值写入文件。参数必须为字符串或数字,若要输出其它值,则需通过 tostring 或 string.format 进行转换。
14.io.write (…)
相当于 io.output():write。
15.file:seek ([whence] [, offset])
设置和获取当前文件位置,成功则返回最终的文件位置(按字节,相对于文件开头),失败则返回 nil 加错误信息。缺省时,whence 默认为 “cur”,offset 默认为 0。 参数 whence:
16.file:setvbuf (mode [, size])
设置输出文件的缓冲模式。模式:
最后两种模式,size 可以指定缓冲的大小(按字节),忽略 size 将自动调整为最佳的大小。
下面我们看一个隐式跟显式打开文件的例子:
隐式:
打开已经存在的 test1.txt 文件,并读取里面的内容
file = io.input("test1.txt") -- 使用 io.input() 函数打开文件 repeat line = io.read() -- 逐行读取内容,文件结束时返回nil if nil == line then break end print(line) until (false) io.close(file) -- 关闭文件 --> output my test file hello lua
在 test1.txt 文件的最后添加一行 “hello world”
file = io.open("test1.txt", "a+") -- 使用 io.open() 函数,以添加模式打开文件 io.output(file) -- 使用 io.output() 函数,设置默认输出文件 io.write("\nhello world") -- 使用 io.write() 函数,把内容写到文件 io.close(file)
显式:
打开已经存在的 test2.txt 文件,并读取里面的内容
file = io.open("test2.txt", "r") -- 使用 io.open() 函数,以只读模式打开文件 for line in file:lines() do -- 使用 file:lines() 函数逐行读取文件 print(line) end file:close() -->output my test2 hello lua
在 test2.txt 文件的最后添加一行 “hello world”
file = io.open("test2.txt", "a") -- 使用 io.open() 函数,以添加模式打开文件 file:write("\nhello world") -- 使用 file:open() 函数,在文件末尾追加内容 file:close()
相关文章推荐
- 详解Lua中的表的概念及其相关操作方法
- Lua编程示例(二):面向对象、metatable对表进行扩展
- 把Lua编译进nginx步骤方法
- Lua脚本自动生成APK包
- Lua中的元表(metatable)、元方法(metamethod)详解
- Lua中的metatable介绍
- Lua中ipair和pair的区别
- Lua中的函数精讲笔记
- 浅谈Lua的面向对象特性
- 详解Lua中的变量相关知识点
- Lua脚本语言入门笔记
- Lua脚本调用外部脚本
- 详解Lua中的if语句的使用方法
- Lua中调用函数使用点号和冒号的区别
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中强大的元方法__index详解
- Lua中调用C++函数示例
- Lua面向对象之类和继承浅析
- Lua性能优化技巧(一):前言
- Lua中获取table长度问题探讨