Lua IO庫詳解

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操作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狰域,一起剝皮案震驚了整個(gè)濱河市媳拴,隨后出現(xiàn)的幾起案子黄橘,更是在濱河造成了極大的恐慌,老刑警劉巖屈溉,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塞关,死亡現(xiàn)場離奇詭異,居然都是意外死亡子巾,警方通過查閱死者的電腦和手機(jī)帆赢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來线梗,“玉大人椰于,你說我怎么就攤上這事∫巧Γ” “怎么了瘾婿?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烤咧。 經(jīng)常有香客問我偏陪,道長,這世上最難降的妖魔是什么煮嫌? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任笛谦,我火速辦了婚禮,結(jié)果婚禮上昌阿,老公的妹妹穿的比我還像新娘揪罕。我一直安慰自己,他們只是感情好宝泵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著轩娶,像睡著了一般儿奶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鳄抒,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天闯捎,我揣著相機(jī)與錄音,去河邊找鬼许溅。 笑死瓤鼻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贤重。 我是一名探鬼主播茬祷,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼并蝗!你這毒婦竟也來了祭犯?” 一聲冷哼從身側(cè)響起秸妥,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沃粗,沒想到半個(gè)月后粥惧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡最盅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年突雪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涡贱。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咏删,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盼产,到底是詐尸還是另有隱情饵婆,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布戏售,位于F島的核電站侨核,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏灌灾。R本人自食惡果不足惜搓译,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锋喜。 院中可真熱鬧些己,春花似錦、人聲如沸嘿般。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炉奴。三九已至逼庞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞻赶,已是汗流浹背赛糟。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砸逊,地道東北人璧南。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像师逸,于是被迫代替她去往敵國和親司倚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)对湃,斷路器崖叫,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,358評(píng)論 0 17
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法拍柒,類相關(guān)的語法心傀,內(nèi)部類的語法,繼承相關(guān)的語法拆讯,異常的語法脂男,線程的語...
    子非魚_t_閱讀 31,587評(píng)論 18 399
  • 作者:云瑞微信公眾號(hào):馬虎眼 李坤是我的大學(xué)同學(xué),畢業(yè)后本來是想做技術(shù)開發(fā)种呐,寫代碼宰翅,跟自己的專業(yè)方向?qū)冢舱伊艘?..
    astak3閱讀 248評(píng)論 1 0
  • 這是我看東野圭吾的第二本書,看完之后除了震撼阔墩,還有徘徊在內(nèi)心深處的不忍嘿架,百感交集,無論是桐原亮司啸箫,還是唐澤雪穗耸彪,讓...
    萌少年閱讀 2,170評(píng)論 5 14