[转帖]lua-book-文件操作

lua,book,文件,操作 · 浏览次数 : 0

小编点评

**Lua I/O 库** **简单模式 (simple model)** * 有一个当前输入文件和一个当前输出文件。 * 提供针对这些文件相关的操作。 **完全模式 (complete model)** * 使用外部的文件句柄来实现。 * 以一种面对对象的形式,将所有的文件操作定义为文件句柄的方法。 * 对文件进行简单的读写操作时可以使用简单模式,但对文件进行一些高级的操作简单模式则处理不了了。 **主要函数:** * `io.open(filename [, mode])`:以 `mode` 模式打开一个文件 `filename`。 * `io.input(file)`:设置默认输入文件为 `file`。 * `io.output(file)`:设置默认输出文件为 `file`。 * `io.write(content)`:在文件最后一行添加 `content` 内容。 * `io.read()`:读取文件的一行。 * `io.lines(optional file name)`:返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回 `nil`。 **示例:** ```lua -- 简单模式 file = io.open("test_file.txt", "w+") io.output(file, "hello lua!\hahah") io.close(file) -- 全部模式 file = io.open("test_file.txt", "r") io.input(file) while true do line = io.read() if line == nil then break end print(line) end io.close(file) ``` **用途:** * 读取和处理文件。 * 对文件进行简单的读写操作。 * 对文件进行一些高级操作需要使用完全模式。

正文

http://me.52fhy.com/lua-book/chapter8.html

 


Lua I/O 库用于读取和处理文件。分为简单模式、完全模式。

  • 简单模式(simple model) 拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。
  • 完全模式(complete model) 使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件操作定义为文件句柄的方法。

对文件进行简单的读写操作时可以使用简单模式,但是对文件进行一些高级的操作简单模式则处理不了了。

简单模式

简单模式由io模块提供,主要有:

  • io.open(filename [, mode]): 以mode模式打开一个文件
  • io.input(file): 设置默认输入文件为file
  • io.output(file): 设置默认输出文件为file
  • io.write(content): 在文件最后一行添加content内容
  • io.read(): 读取文件的一行。
    参数可以是下列中的一个:
    "*n"	读取一个数字并返回它。例:file.read("*n")
    "*a"	从当前位置读取整个文件。例:file.read("*a")
    "*l"   (默认)读取下一行,在文件尾 (EOF) 处返回 nil。例:file.read("*l")
    number	返回一个指定字符个数的字符串,或在 EOF 时返回 nil。例:file.read(5)
    
  • io.close(file): 关闭打开的文件file
  • io.tmpfile(): 返回一个临时文件句柄,该文件以更新模式打开,程序结束时自动删除
  • io.type(file): 检测obj是否一个可用的文件句柄
  • io.flush(): 向文件写入缓冲中的所有数据
  • io.lines(optional file name): 返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回nil,但不关闭文件

mode模式:

模式描述
r 以只读方式打开文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
r+ 以可读写方式打开文件,该文件必须存在。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a+ 与a类似,但此文件可读可写
b 二进制模式,如果文件是二进制文件,可以加上
b+ 二进制模式,表示对文件既可以读也可以写

示例:

-- write
-- src/file_io_write.lua

local file = io.open("test_file.txt", 'w+')
io.output(file) -- 设置默认输出文件
io.write("hello lua!\nhahah") -- 把内容写到文件
io.close(file)

运行后查看生成的文件:

$ cat test_file.txt
hello lua!
nhahah
-- read
-- src/file_io_read.lua

local file = io.open("test_file.txt", 'r')
io.input(file) -- 设置默认输入文件

-- while true do
--     line = io.read()
--     if line == nil then
--         break;
--     end
--     print(line)
-- end

for line in io.lines() do 
    print(line)
end
io.close(file)

运行:

$ luajit file_io_read.lua
hello lua!
hahah

完全模式

简单模式由file模块提供,主要有:

  • file:write(content): 在文件最后一行添加content内容
  • file:read(): 读取文件的一行
  • file:close(): 关闭打开的文件
  • file:seek(optional where, optional offset): 设置和获取当前文件位置,成功则返回最终的文件位置(按字节),失败则返回nil加错误信息。

参数 where 值可以是:

"set": 从文件头开始
"cur": 从当前位置开始[默认]
"end": 从文件尾开始
offset:默认为0
  • file:flush(): 向文件写入缓冲中的所有数据

其中 file 为 io.open() 返回的文件句柄。

示例:

-- read
-- src/file_read.lua

local file = io.open("test_file.txt", 'r')

file:seek("end", -5) -- 定位到文件倒数第 5 个位置
print(file:read("*a")) -- 从当前位置读取整个文件

file:close()  -- 关闭打开的文件

输出:

$ luajit src/file_read.lua
hahah

参考

1、文件操作 · OpenResty最佳实践
https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/file.html

与[转帖]lua-book-文件操作相似的内容:

[转帖]lua-book-文件操作

http://me.52fhy.com/lua-book/chapter8.html Lua I/O 库用于读取和处理文件。分为简单模式、完全模式。 简单模式(simple model) 拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。 完全模式(complete model

[转帖]lua-book

http://me.52fhy.com/lua-book/chapter2.html 数据类型 [TOC] @date: 2018-3-18 Lua中有8个基本类型分别为:nil、boolean、number、string、table、function、userdata、thread。 函数 typ

[转帖]lua-book-运算符

http://me.52fhy.com/lua-book/chapter3.html Lua支持下列主要的运算符: 算术运算符 关系运算符 逻辑运算符 赋值运算符 还支持..、#特殊运算符。其中赋值运算符仅支持=,不支持C语言的+=、++等运算符。 算术运算符 + 加法 - 减法或者负号 * 乘法

[转帖]lua-book-控制语句

http://me.52fhy.com/lua-book/chapter4.html Lua 语言提供的控制结构有 if-else,while,repeat,for,并提供 break、return 关键字来满足更丰富的需求。不支持switch、continue。 Lua 提供的控制语句部分特征类似

[转帖]lua-book-函数

http://me.52fhy.com/lua-book/chapter5.html 在 Lua 中,函数 也是一种数据类型,函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值。 函数定义 函数定义格式: function function_name (arc) -- ar

[转帖]lua-book-模块

http://me.52fhy.com/lua-book/chapter6.html 模块 从Lua5.1开始,Lua添加了对模块和包的支持。 Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个table,然后把需要导出的常量、函数放入其中,最后返回这个

[转帖]lua-book-常用库介绍

http://me.52fhy.com/lua-book/chapter7.html String 库 .. 链接两个字符串 string.upper(argument) 字符串全部转为大写字母。 string.lower(argument) 字符串全部转为小写字母。 string.len(arg)

[转帖]lua-book-元表

http://me.52fhy.com/lua-book/chapter9.html 在Lua5.1语言中,元表 (metatable) 的表现行为类似于 C++ 语言中的操作符重载,类似PHP的魔术方法。Python里也有元类(metaclass)一说。 通过元表,Lua有了更多的扩展特性。Lua

[转帖]Ngx_lua

http://me.52fhy.com/lua-book/chapter12.html 简介 ngx_lua 指的是 lua-nginx-module模块:通过将 LuaJIT 的虚拟机嵌入到 Nginx 的 worker 中,这样既保持高性能,又能不失去lua开发的简单特性。 OpenResty 

[转帖]Redis里使用Lua

http://me.52fhy.com/lua-book/chapter11.html 版本:自2.6.0起可用。 时间复杂度:取决于执行的脚本。 使用Lua脚本的好处: 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。 原子操作。redis会将整个脚本作为一个整体执行,中间不会被