I/O 库提供了两套不同风格的文件处理接口。 第一种风格使用隐式的文件句柄; 它提供设置默认输入文件及默认输出文件的操作, 所有的输入输出操作都针对这些默认文件。 第二种风格使用显式的文件句柄。

当使用隐式文件句柄时, 所有的操作都由表 io 提供。 若使用显式文件句柄, io.open 会返回一个文件句柄,且所有的操作都由该文件句柄的方法来提供。

表 io 中也提供了三个 和 C 中含义相同的预定义文件句柄: io.stdin io.stdout io.stderr。 I/O 库永远不会关闭这些文件。

除非另有说明, I/O 函数在出错时都返回 nil (第二个返回值为错误消息,第三个返回值为系统相关的错误码)。 成功时返回与 nil 不同的值

io:open(filename [, mode])

这个函数用字符串 mode 指定的模式打开一个文件。 返回新的文件句柄。 当出错时,返回 nil 加错误消息。

mode 字符串可以是下列任意值:

  • **"r": **只读模式,这也是对已存在的文件的默认打开模式。
  • **"w": **可写模式,允许修改已经存在的文件和创建新文件(不可读)。
  • **"a": **追加模式,对于已存的文件允许追加新内容,但不允许修改原有内容,同时也可以创建新文件。
  • **"r+": **读写模式打开已存的在文件。
  • **"w+": **如果文件已存在则删除文件中数据;若文件不存在则新建文件。读写模式打开。
  • **"a+": **以可读的追加模式打开已存在文件,若文件不存在则新建文件。

mode 字符串可以在最后加一个 'b' , 这会在某些系统上以二进制方式打开文件。

当文件不存在时

  1. local file = io.open("./test.txt")
  2. file:close()

模式"r","r+",会提示错误,这两种模式不会自动创建为难。

模式"a","a+","w","w+"都会创建文件

当文件存在时

原文件:

  1. test.txt
  2. this is test 1
  3. this is test 2

lua文件:

  1. local file = io.open("./test.txt", mode)
  2. print(file:write("123", "a"))
  3. file:close()
  4. local file = io.open("./test.txt", "r+")
  5. print(file:read("*a"))
  6. file:close()

对不同模式,分别调用读写操作

mode为"r"
  1. Output:
  2. 写:
  3. nil Bad file descriptor 9

文件可读,不可写

mode为"r+"
  1. Output :
  2. true
  3. 文件内容:
  4. 123a is test 1
  5. this is test 2

文件内容保留,新内容从文件头输入

可读

mode为"w"
  1. Output :
  2. true
  3. 文件内容:
  4. 123a
  5. 读:
  6. nil No error 0

用输入内容覆盖文件内容

使用"w"模式打开文件时,会立即删除文件内容,即使不写入内容.

用"w"模式读时,返回nil

mode为"w+"
  1. Output:
  2. true
  3. 文件内容:
  4. 123a

用输入内容覆盖文件内容

使用"w+"模式打开文件时,会立即删除文件内容

用"w+"模式读时,返回空字符串

mode为"a"
  1. Output:
  2. true
  3. 文件内容:
  4. this is test 1
  5. this is test 2123a
  6. 读:
  7. nil No error 0

追加模式写入

不可读

mode为"a+"
  1. Output:
  2. true
  3. 文件内容:
  4. this is test 1
  5. this is test 2123a

追加模式写入

可读


io:input([file])

用文件名调用它时,(以文本模式)来打开该名字的文件, 并将文件句柄设为默认输入文件。 如果用文件句柄去调用它, 就简单的将该句柄设为默认输入文件。 如果调用时不传参数,它返回当前的默认输入文件。

在出错的情况下,函数抛出错误而不是返回错误码。

  1. --文件名
  2. io.input("./test.txt")
  3. print(io.read("*a"))
  4. io:close()
  5. Output:
  6. this is test 1
  7. this is test 2
  8. --文件句柄(需要使用可读模式)
  9. local file = io.open("./test.txt", "r")
  10. print(io.input(file))
  11. print(io.read("*a"))
  12. print(file)
  13. io.close()
  14. Output:
  15. file (777E1BD8)
  16. this is test 1
  17. this is test 2
  18. file (777E1BD8

io:output([file])

用文件名调用它时,(以文本模式)来打开该名字的文件, 并将文件句柄设为默认输出文件。 如果用文件句柄去调用它, 就简单的将该句柄设为默认输出文件。 如果调用时不传参数,它返回当前的默认输出文件。

在出错的情况下,函数抛出错误而不是返回错误码。

  1. print(io.output("./test.txt"))
  2. io.write("123")
  3. io.close()
  4. Output:
  5. file (777E1BD8)
  6. 文件内容:
  7. 123

io.popen (prog [, mode])

这个函数和系统有关,不是所有的平台都提供。

用一个分离进程开启程序 prog, 返回的文件句柄可用于从这个程序中读取数据 (如果 mode 为 "r",这是默认值) 或是向这个程序写入输入(当 mode 为 "w" 时)。


io.tmpfile()

返回一个临时文件的句柄。 这个文件以更新模式打开,在程序结束时会自动删除。


io.type(obj)

检查 obj 是否是合法的文件句柄。 如果 obj 它是一个打开的文件句柄,返回字符串 "file"。 如果 obj 是一个关闭的文件句柄,返回字符串 "closed file"。 如果 obj 不是文件句柄,返回 nil

  1. local file = io.tmpfile()
  2. print(io.type(file))
  3. file:close()
  4. print(io.type(file))
  5. print(io.type({}))
  6. Output:
  7. file
  8. closed file
  9. nil

io.lines([filename])

提供一个循环迭代器以遍历文件,如果指定了文件名则当遍历结束后将自动关闭该文件;若使用默认文件,则遍历结束后不会自动关闭文件。

  1. for line in io.lines("./test.txt") do
  2. print(line)
  3. end
  4. Output:
  5. this is test 1
  6. this is test 2

注:Lua 5.3 有变动,添加模式数


file:lines()

返回一个迭代器函数, 每次调用迭代器时,都从文件中取一行数据,和 io.lines 不同, 这个函数在循环结束后不会关闭文件。

注:Lua 5.3 有变动,添加模式数


file:read(...)

读文件 file, 指定的格式决定了要读什么。 对于每种格式,函数返回读出的字符对应的字符串或数字。 若不能以该格式对应读出数据则返回 nil。 (对于最后这种情况, 函数不会读出后续的格式。) 当调用时不传格式,它会使用默认格式读下一行

  • **"*n": ** 从文件当前位置读入一个数字,如果该位置不为数字则返回 nil。
  • **"*l": ** 读入当前行。
  • **"*a": ** 读入从当前文件指针位置开始的整个文件内容。
  • number: 读入指定字节数的内容。
  1. local file = io.open("./test.txt", "r")
  2. print(file:read("*l"))
  3. print(file:read("*n"))
  4. print(file:read(2))
  5. Output:
  6. this is test 1
  7. nil
  8. th

注:Lua 5.3 有变动,去掉*号,并添加"i"和"L"格式


io:read(...)

等价于 io.input():read(···)。


file:write(...)

将参数的值逐个写入 file。 参数必须是字符串或数字。

成功时,函数返回 file。 否则返回 nil 加错误描述字符串。


io:write(...)

等价于 io.output():write(···)。


file:close()

关闭 file。 注意,文件在句柄被垃圾回收时会自动关闭, 但是多久以后发生,时间不可预期的。


io:close()

等价于 file:close()。 不给出 file 时将关闭默认输出文件。


file:flush()

将写入的数据保存到 file 中


io:flush()

等价于 io.output():flush()。


file:seek([whence [, offset]])

设置及获取基于文件开头处计算出的位置。 设置的位置由 offset 和 whence 字符串 whence 指定的基点决定。基点可以是:

  • **"set": **基点为 0 (文件开头);
  • **"cur": **基点为当前位置了;
  • **"end": **基点为文件尾;

当 seek 成功时,返回最终从文件开头计算起的文件的位置。 当 seek 失败时,返回 nil 加上一个错误描述字符串。

whence 的默认值是 "cur", offset 默认为 0 。 因此,调用 file:seek() 可以返回文件当前位置,并不改变它; 调用 file:seek("set") 将位置设为文件开头(并返回 0); 调用 file:seek("end") 将位置设到文件末尾,并返回文件大小。

  1. local file = io.open("./test.txt", "r+")
  2. print(file:seek("end"))
  3. print(file:seek("set"))
  4. print(file:seek())
  5. print(file:seek("cur", 10))
  6. print(file:seek("cur"))
  7. print(file:read(1))
  8. print(file:seek("cur"))
  9. file:write("123")
  10. file:close()
  11. Output:
  12. 30
  13. 0
  14. 0
  15. 10
  16. 10
  17. s
  18. 11

修改文件的值会影响read操作 以及以"r+"模式打开文件的write操作

Lua IO库详解的更多相关文章

  1. 18、标准IO库详解及实例

    标准IO库是由Dennis Ritchie于1975年左右编写的,它是Mike Lestbain写的可移植IO库的主要修改版本,2010年以后, 标准IO库几乎没有进行什么修改.标准IO库处理了很多细 ...

  2. Lua string库详解

    1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,...2. string库中所有的function都不会直接操作字符串,而是返回一个结果 string.byte(s ...

  3. Lua的协程和协程库详解

    我们首先介绍一下什么是协程.然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法. 一.协程是什么? (1)线程 首先复习一下多线程.我们都知道线程——Thre ...

  4. STM32固件库详解

    STM32固件库详解   emouse原创文章,转载请注明出处http://www.cnblogs.com/emouse/ 应部分网友要求,最新加入固件库以及开发环境使用入门视频教程,同时提供例程模板 ...

  5. 常用开发库 - MapStruct工具库详解

    常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ...

  6. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  7. JAVA IO 类库详解

    JAVA IO类库详解 一.InputStream类 1.表示字节输入流的所有类的超类,是一个抽象类. 2.类的方法 方法 参数 功能详述 InputStream 构造方法 available 如果用 ...

  8. 【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...

  9. Python--urllib3库详解1

    Python--urllib3库详解1 Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3.Urllib3提供了很多pyt ...

随机推荐

  1. hdoj 5074

    Problem Description Hatsune Miku is a popular virtual singer. It is very popular in both Japan and C ...

  2. 更改星级评分条 RatingBar 的样式

    1.首先在布局中引用星级评分条: <RatingBar            android:id="@+id/room_ratingbar"            styl ...

  3. 1476. Lunar Code

    http://acm.timus.ru/problem.aspx?space=1&num=1476 由于前一列对后一列有影响,所以需要保持前一列的状态, 但无需用状态压缩来保存(也保存不了) ...

  4. Trie树-字典查找

    描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...

  5. 简单尝试利用vultr vps自架PPTP上网用于工作学习需要

    因为学习和工作的需要用到登陆海外网站查阅相关的资料和文档,之前有需要使用的时候是问网友索要的账户登录本地电脑拨号的,但是老是跟别人要还是不好,决定自己尝试搭建一个长期使用.看到有不少的介绍提到VULT ...

  6. 【转】tomcat性能调优

    一.总结前一天的学习 从"第三天"的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是: ü   吞吐量 ü   Responsetime ü   Cpuload ü   ...

  7. asp.net初识

    请求=========处理=============响应 不是服务器读网页.表单,而是我们向服务器提交数据 1.asp.net 服务器端控件是ASP.NET对HTML的封装,ASP.NET会将服务器端 ...

  8. what we do and how we behave

    It comes after a report last week revealed the "brutal" treatment of terror suspects by th ...

  9. md5应用

    /* md5工具类 */ public class MD5Util { /**全局数组**/ private final static String[] strDigits = { "0&q ...

  10. AngulaJs+Web Api Cors 跨域访问失败的解决办法

    //在服务的WebConfig文件中添加以下代码即可 //如节点已存在请去掉 <system.webServer> <httpProtocol> <customHeade ...