I/O 庫提供了兩套不同風(fēng)格的文件處理接口勺像。 第一種風(fēng)格使用隱式的文件句柄; 它提供設(shè)置默認(rèn)輸入文件及默認(rèn)輸出文件的操作, 所有的輸入輸出操作都針對(duì)這些默認(rèn)文件关划。 第二種風(fēng)格使用顯式的文件句柄坡贺。
當(dāng)使用隱式文件句柄時(shí)官辈, 所有的操作都由表 io 提供箱舞。 若使用顯式文件句柄, io.open 會(huì)返回一個(gè)文件句柄拳亿,且所有的操作都由該文件句柄的方法來提供晴股。
表 io 中也提供了三個(gè) 和 C 中含義相同的預(yù)定義文件句柄: io.stdin io.stdout io.stderr。 I/O 庫永遠(yuǎn)不會(huì)關(guān)閉這些文件肺魁。
除非另有說明电湘, I/O 函數(shù)在出錯(cuò)時(shí)都返回 nil (第二個(gè)返回值為錯(cuò)誤消息,第三個(gè)返回值為系統(tǒng)相關(guān)的錯(cuò)誤碼)鹅经。 成功時(shí)返回與 nil 不同的值
io:open(filename [, mode])
這個(gè)函數(shù)用字符串 mode 指定的模式打開一個(gè)文件寂呛。 返回新的文件句柄。 當(dāng)出錯(cuò)時(shí)瘾晃,返回 nil 加錯(cuò)誤消息贷痪。
mode 字符串可以是下列任意值:
- **"r": **只讀模式,這也是對(duì)已存在的文件的默認(rèn)打開模式蹦误。
- **"w": **可寫模式劫拢,允許修改已經(jīng)存在的文件和創(chuàng)建新文件(不可讀)。
- **"a": **追加模式强胰,對(duì)于已存的文件允許追加新內(nèi)容舱沧,但不允許修改原有內(nèi)容,同時(shí)也可以創(chuàng)建新文件偶洋。
- **"r+": **讀寫模式打開已存的在文件熟吏。
- **"w+": **如果文件已存在則刪除文件中數(shù)據(jù);若文件不存在則新建文件玄窝。讀寫模式打開牵寺。
- **"a+": **以可讀的追加模式打開已存在文件,若文件不存在則新建文件哆料。
mode 字符串可以在最后加一個(gè) 'b' 缸剪, 這會(huì)在某些系統(tǒng)上以二進(jìn)制方式打開文件。
當(dāng)文件不存在時(shí)
local file = io.open("./test.txt")
file:close()
模式"r","r+",會(huì)提示錯(cuò)誤,這兩種模式不會(huì)自動(dòng)創(chuàng)建為難东亦。
模式"a","a+","w","w+"都會(huì)創(chuàng)建文件
當(dāng)文件存在時(shí)
原文件:
test.txt
this is test 1
this is test 2
lua文件:
local file = io.open("./test.txt", mode)
print(file:write("123", "a"))
file:close()
local file = io.open("./test.txt", "r+")
print(file:read("*a"))
file:close()
對(duì)不同模式,分別調(diào)用讀寫操作
mode為"r"
Output:
寫:
nil Bad file descriptor 9
文件可讀,不可寫
mode為"r+"
Output :
true
文件內(nèi)容:
123a is test 1
this is test 2
文件內(nèi)容保留,新內(nèi)容從文件頭輸入
可讀
mode為"w"
Output :
true
文件內(nèi)容:
123a
讀:
nil No error 0
用輸入內(nèi)容覆蓋文件內(nèi)容
使用"w"模式打開文件時(shí),會(huì)立即刪除文件內(nèi)容,即使不寫入內(nèi)容.
用"w"模式讀時(shí),返回nil
mode為"w+"
Output:
true
文件內(nèi)容:
123a
用輸入內(nèi)容覆蓋文件內(nèi)容
使用"w+"模式打開文件時(shí),會(huì)立即刪除文件內(nèi)容
用"w+"模式讀時(shí),返回空字符串
mode為"a"
Output:
true
文件內(nèi)容:
this is test 1
this is test 2123a
讀:
nil No error 0
追加模式寫入
不可讀
mode為"a+"
Output:
true
文件內(nèi)容:
this is test 1
this is test 2123a
追加模式寫入
可讀
io:input([file])
用文件名調(diào)用它時(shí)杏节,(以文本模式)來打開該名字的文件, 并將文件句柄設(shè)為默認(rèn)輸入文件典阵。 如果用文件句柄去調(diào)用它奋渔, 就簡單的將該句柄設(shè)為默認(rèn)輸入文件。 如果調(diào)用時(shí)不傳參數(shù)壮啊,它返回當(dāng)前的默認(rèn)輸入文件嫉鲸。
在出錯(cuò)的情況下,函數(shù)拋出錯(cuò)誤而不是返回錯(cuò)誤碼歹啼。
--文件名
io.input("./test.txt")
print(io.read("*a"))
io:close()
Output:
this is test 1
this is test 2
--文件句柄(需要使用可讀模式)
local file = io.open("./test.txt", "r")
print(io.input(file))
print(io.read("*a"))
print(file)
io.close()
Output:
file (777E1BD8)
this is test 1
this is test 2
file (777E1BD8
io:output([file])
用文件名調(diào)用它時(shí)玄渗,(以文本模式)來打開該名字的文件座菠, 并將文件句柄設(shè)為默認(rèn)輸出文件。 如果用文件句柄去調(diào)用它藤树, 就簡單的將該句柄設(shè)為默認(rèn)輸出文件浴滴。 如果調(diào)用時(shí)不傳參數(shù),它返回當(dāng)前的默認(rèn)輸出文件岁钓。
在出錯(cuò)的情況下升略,函數(shù)拋出錯(cuò)誤而不是返回錯(cuò)誤碼。
print(io.output("./test.txt"))
io.write("123")
io.close()
Output:
file (777E1BD8)
文件內(nèi)容:
123
io.popen (prog [, mode])
這個(gè)函數(shù)和系統(tǒng)有關(guān)屡限,不是所有的平臺(tái)都提供品嚣。
用一個(gè)分離進(jìn)程開啟程序 prog, 返回的文件句柄可用于從這個(gè)程序中讀取數(shù)據(jù) (如果 mode 為 "r"钧大,這是默認(rèn)值) 或是向這個(gè)程序?qū)懭胼斎耄ó?dāng) mode 為 "w" 時(shí))翰撑。
io.tmpfile()
返回一個(gè)臨時(shí)文件的句柄。 這個(gè)文件以更新模式打開拓型,在程序結(jié)束時(shí)會(huì)自動(dòng)刪除额嘿。
io.type(obj)
檢查 obj 是否是合法的文件句柄。 如果 obj 它是一個(gè)打開的文件句柄劣挫,返回字符串 "file"。 如果 obj 是一個(gè)關(guān)閉的文件句柄东帅,返回字符串 "closed file"压固。 如果 obj 不是文件句柄,返回 nil 靠闭。
local file = io.tmpfile()
print(io.type(file))
file:close()
print(io.type(file))
print(io.type({}))
Output:
file
closed file
nil
io.lines([filename])
提供一個(gè)循環(huán)迭代器以遍歷文件帐我,如果指定了文件名則當(dāng)遍歷結(jié)束后將自動(dòng)關(guān)閉該文件;若使用默認(rèn)文件愧膀,則遍歷結(jié)束后不會(huì)自動(dòng)關(guān)閉文件拦键。
for line in io.lines("./test.txt") do
print(line)
end
Output:
this is test 1
this is test 2
注:Lua 5.3 有變動(dòng),添加模式數(shù)
file:lines()
返回一個(gè)迭代器函數(shù), 每次調(diào)用迭代器時(shí)檩淋,都從文件中取一行數(shù)據(jù),和 io.lines 不同芬为, 這個(gè)函數(shù)在循環(huán)結(jié)束后不會(huì)關(guān)閉文件。
注:Lua 5.3 有變動(dòng),添加模式數(shù)
file:read(...)
讀文件 file蟀悦, 指定的格式?jīng)Q定了要讀什么媚朦。 對(duì)于每種格式,函數(shù)返回讀出的字符對(duì)應(yīng)的字符串或數(shù)字日戈。 若不能以該格式對(duì)應(yīng)讀出數(shù)據(jù)則返回 nil询张。 (對(duì)于最后這種情況, 函數(shù)不會(huì)讀出后續(xù)的格式浙炼。) 當(dāng)調(diào)用時(shí)不傳格式份氧,它會(huì)使用默認(rèn)格式讀下一行
- *"n": ** 從文件當(dāng)前位置讀入一個(gè)數(shù)字唯袄,如果該位置不為數(shù)字則返回 nil。
- *"l": ** 讀入當(dāng)前行蜗帜。
- *"a": ** 讀入從當(dāng)前文件指針位置開始的整個(gè)文件內(nèi)容恋拷。
- number: 讀入指定字節(jié)數(shù)的內(nèi)容。
local file = io.open("./test.txt", "r")
print(file:read("*l"))
print(file:read("*n"))
print(file:read(2))
Output:
this is test 1
nil
th
注:Lua 5.3 有變動(dòng),去掉*號(hào),并添加"i"和"L"格式
io:read(...)
等價(jià)于 io.input():read(···)钮糖。
file:write(...)
將參數(shù)的值逐個(gè)寫入 file梅掠。 參數(shù)必須是字符串或數(shù)字。
成功時(shí)店归,函數(shù)返回 file阎抒。 否則返回 nil 加錯(cuò)誤描述字符串。
io:write(...)
等價(jià)于 io.output():write(···)消痛。
file:close()
關(guān)閉 file且叁。 注意,文件在句柄被垃圾回收時(shí)會(huì)自動(dòng)關(guān)閉秩伞, 但是多久以后發(fā)生逞带,時(shí)間不可預(yù)期的。
io:close()
等價(jià)于 file:close()纱新。 不給出 file 時(shí)將關(guān)閉默認(rèn)輸出文件展氓。
file:flush()
將寫入的數(shù)據(jù)保存到 file 中
io:flush()
等價(jià)于 io.output():flush()。
file:seek([whence [, offset]])
設(shè)置及獲取基于文件開頭處計(jì)算出的位置脸爱。 設(shè)置的位置由 offset 和 whence 字符串 whence 指定的基點(diǎn)決定遇汞。基點(diǎn)可以是:
- **"set": **基點(diǎn)為 0 (文件開頭)簿废;
- **"cur": **基點(diǎn)為當(dāng)前位置了空入;
- **"end": **基點(diǎn)為文件尾;
當(dāng) seek 成功時(shí)族檬,返回最終從文件開頭計(jì)算起的文件的位置歪赢。 當(dāng) seek 失敗時(shí),返回 nil 加上一個(gè)錯(cuò)誤描述字符串单料。
whence 的默認(rèn)值是 "cur"埋凯, offset 默認(rèn)為 0 。 因此看尼,調(diào)用 file:seek() 可以返回文件當(dāng)前位置递鹉,并不改變它; 調(diào)用 file:seek("set") 將位置設(shè)為文件開頭(并返回 0)藏斩; 調(diào)用 file:seek("end") 將位置設(shè)到文件末尾躏结,并返回文件大小。
local file = io.open("./test.txt", "r+")
print(file:seek("end"))
print(file:seek("set"))
print(file:seek())
print(file:seek("cur", 10))
print(file:seek("cur"))
print(file:read(1))
print(file:seek("cur"))
file:write("123")
file:close()
Output:
30
0
0
10
10
s
11
修改文件的值會(huì)影響read操作 以及以"r+"模式打開文件的write操作