鍍金池/ 教程/ Java/ 文件 I/O
數(shù)據(jù)庫(kù)訪問(wèn)
循環(huán)
數(shù)組
錯(cuò)誤處理
面向?qū)ο?/span>
調(diào)試
游戲開(kāi)發(fā)
文件 I/O
變量
迭代器
Web 編程
模塊
函數(shù)
元表
協(xié)程
垃圾回收機(jī)制
標(biāo)準(zhǔn)庫(kù)
決策
數(shù)據(jù)類(lèi)型
運(yùn)行環(huán)境
操作符
字符串
基本語(yǔ)法
概述

文件 I/O

Lua 的 IO 庫(kù)用于讀取或操作文件。Lua IO 庫(kù)提供兩類(lèi)文件操作,它們分別是隱式文件描述符(implict file descriptors)和顯式文件描述符(explicit file descriptors)。

在接下來(lái)的例子的,我們會(huì)用到一個(gè)示例文件 test.lua,文件內(nèi)容如下:

-- sample test.lua
-- sample2 test.lua

簡(jiǎn)單的打開(kāi)文件操作可以用如下的語(yǔ)句完成。

file = io.open (filename [, mode])

可選的打開(kāi)文件的模式如下表所示。

模式 描述
"r" 只讀模式,這也是對(duì)已存在的文件的默認(rèn)打開(kāi)模式。
"w" 可寫(xiě)模式,允許修改已經(jīng)存在的文件和創(chuàng)建新文件。
"a" 追加模式,對(duì)于已存的文件允許追加新內(nèi)容,但不允許修改原有內(nèi)容,同時(shí)也可以創(chuàng)建新文件。
"r+" 讀寫(xiě)模式打開(kāi)已存的在文件。
"w+" 如果文件已存在則刪除文件中數(shù)據(jù);若文件不存在則新建文件。讀寫(xiě)模式打開(kāi)。
"a+" 以可讀的追加模式打開(kāi)已存在文件,若文件不存在則新建文件。

隱式文件描述符

隱式文件描述符使用標(biāo)準(zhǔn)輸入輸出模式或者使用單個(gè)輸入文件和輸出文件。使用隱匿文件描述符的示例代碼如下:

-- 只讀模式打開(kāi)文件
file = io.open("test.lua", "r")

-- 將 test.lua 設(shè)置為默認(rèn)輸入文件
io.input(file)

--打印輸出文件的第一行
print(io.read())

-- 關(guān)閉打開(kāi)的文件
io.close(file)

-- 以追加模式打開(kāi)文件
file = io.open("test.lua", "a")

-- 將 test.lua 設(shè)置為默認(rèn)的輸出文件
io.output(file)

-- 將內(nèi)容追加到文件最后一行
io.write("-- End of the test.lua file")

-- 關(guān)閉打開(kāi)的文件
io.close(file)

執(zhí)行上面的程序,我們可以看到輸出了 test.lua 文件的第一行。在本例中,輸出的結(jié)果為:

- Sample test.lua

輸出的內(nèi)容是 test.lua 文件中的第一行?!?- End of the test.lua file” 他會(huì)被追加到 test.lua 文件的最后一行。

從上面的例子中,你可以看到隱式的描述述如何使用 io."x" 方法與文件系統(tǒng)交互。上面的例子使用 io.read() 函數(shù)時(shí)沒(méi)有使用可選參數(shù)。此函數(shù)的可選參數(shù)包括:

模式 描述
"*n" 從文件當(dāng)前位置讀入一個(gè)數(shù)字,如果該位置不為數(shù)字則返回 nil。
"*a" 讀入從當(dāng)前文件指針位置開(kāi)始的整個(gè)文件內(nèi)容。
"*i" 讀入當(dāng)前行。
number 讀入指定字節(jié)數(shù)的內(nèi)容。

另外一些常用的方法:

  • io.tmpfile():返回一個(gè)可讀寫(xiě)的臨時(shí)文件,程序結(jié)束時(shí)該文件被自動(dòng)刪除。
  • io.type(file):檢測(cè)輸入?yún)?shù)是否為可用的文件句柄。返回 "file" 表示一個(gè)打開(kāi)的句柄;“closed file” 表示已關(guān)閉的句柄;nil 表示不是文件句柄。
  • io.flush():清空輸出緩沖區(qū)。
  • io.lines(optional file name): 返回一個(gè)通用循環(huán)迭代器以遍歷文件,每次調(diào)用將獲得文件中的一行內(nèi)容,當(dāng)?shù)轿募矔r(shí),將返回nil。若顯示提供了文件句柄,則結(jié)束時(shí)自動(dòng)關(guān)閉文件;使用默認(rèn)文件時(shí),結(jié)束時(shí)不會(huì)自動(dòng)關(guān)閉文件。

顯示文件描述符

我們也會(huì)經(jīng)常用到顯示文件描述符,因?yàn)樗试S我們同時(shí)操作多個(gè)文件。這些函數(shù)與隱式文件描述符非常相似,只不過(guò)我們?cè)谶@兒使用 file:function_name 而不是使用 io.function_name 而已。下面的例子使用顯示文件描述符實(shí)現(xiàn)了與前面例子中完全相同的功能。
 

-- 只讀模式打開(kāi)文件
file = io.open("test.lua", "r")

-- 輸出文件的第一行
print(file:read())

-- 關(guān)閉打開(kāi)的文件
file:close()

-- 以追加模式打開(kāi)文件 
file = io.open("test.lua", "a")

-- 添加內(nèi)容到文件的尾行
file:write("--test")

-- 關(guān)閉打開(kāi)的文件
file:close()

執(zhí)行上面的程序,我們可以得到與前面使用隱式文件描述符類(lèi)似的輸出結(jié)果:

-- Sample test.lua

在顯式文件描述符中,打開(kāi)文件的描述與讀文件時(shí)的參數(shù)與隱式文件描述中的完全相同。另外的常用方法包括:

  • file:seek(option whence,option offset):此函數(shù)用于移動(dòng)文件指針至新的位置。參數(shù) whence 可以設(shè)置為 “set”,"cur","end",offset 為一個(gè)偏移量值,描述相對(duì)位置。如果第一個(gè)參數(shù)為 "set",則相對(duì)位置從文件開(kāi)始處開(kāi)始計(jì)算;如果第一個(gè)參數(shù)為 "cur",則相對(duì)位置從文件當(dāng)前位置處開(kāi)始計(jì)算; 如果第一個(gè)參數(shù)為 "end",則相對(duì)位置從文件末尾處開(kāi)始計(jì)算。函數(shù)的參數(shù)默認(rèn)值分別為 "cur" 和 0,因此不傳遞參數(shù)調(diào)用此函數(shù)可以獲得文件的當(dāng)前位置。
  • file:flush():清空輸出緩沖區(qū)。
  • io.lines(optional file name):提供一個(gè)循環(huán)迭代器以遍歷文件,如果指定了文件名則當(dāng)遍歷結(jié)束后將自動(dòng)關(guān)閉該文件;若使用默認(rèn)文件,則遍歷結(jié)束后不會(huì)自動(dòng)關(guān)閉文件。

下面的例子演示 seek 函數(shù)的使用方法。它將文件指針從文件末尾向前移動(dòng) 25。并使用 read 函數(shù)從該位置出輸出剩余的文件內(nèi)容。

-- Opens a file in read
file = io.open("test.lua", "r")

file:seek("end",-25)
print(file:read("*a"))

-- closes the opened file
file:close()

執(zhí)行上的面的程序,你可以得到類(lèi)似下面的輸出結(jié)果:

 sample2 test.lua
--test

你還可以嘗試不同的參數(shù)了解更多的 Lua 文件操作方法。

上一篇:字符串下一篇:運(yùn)行環(huán)境