Lua 的 IO 庫用于讀取或操作文件。Lua IO 庫提供兩類文件操作,它們分別是隱式文件描述符(implict file descriptors)和顯式文件描述符(explicit file descriptors)。
在接下來的例子的,我們會用到一個示例文件 test.lua,文件內(nèi)容如下:
-- sample test.lua
-- sample2 test.lua
簡單的打開文件操作可以用如下的語句完成。
file = io.open (filename [, mode])
可選的打開文件的模式如下表所示。
模式 | 描述 |
---|---|
"r" | 只讀模式,這也是對已存在的文件的默認(rèn)打開模式。 |
"w" | 可寫模式,允許修改已經(jīng)存在的文件和創(chuàng)建新文件。 |
"a" | 追加模式,對于已存的文件允許追加新內(nèi)容,但不允許修改原有內(nèi)容,同時也可以創(chuàng)建新文件。 |
"r+" | 讀寫模式打開已存的在文件。 |
"w+" | 如果文件已存在則刪除文件中數(shù)據(jù);若文件不存在則新建文件。讀寫模式打開。 |
"a+" | 以可讀的追加模式打開已存在文件,若文件不存在則新建文件。 |
隱式文件描述符使用標(biāo)準(zhǔn)輸入輸出模式或者使用單個輸入文件和輸出文件。使用隱匿文件描述符的示例代碼如下:
-- 只讀模式打開文件
file = io.open("test.lua", "r")
-- 將 test.lua 設(shè)置為默認(rèn)輸入文件
io.input(file)
--打印輸出文件的第一行
print(io.read())
-- 關(guān)閉打開的文件
io.close(file)
-- 以追加模式打開文件
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)閉打開的文件
io.close(file)
執(zhí)行上面的程序,我們可以看到輸出了 test.lua 文件的第一行。在本例中,輸出的結(jié)果為:
- Sample test.lua
輸出的內(nèi)容是 test.lua 文件中的第一行?!?- End of the test.lua file” 他會被追加到 test.lua 文件的最后一行。
從上面的例子中,你可以看到隱式的描述述如何使用 io."x" 方法與文件系統(tǒng)交互。上面的例子使用 io.read() 函數(shù)時沒有使用可選參數(shù)。此函數(shù)的可選參數(shù)包括:
模式 | 描述 |
---|---|
"*n" | 從文件當(dāng)前位置讀入一個數(shù)字,如果該位置不為數(shù)字則返回 nil。 |
"*a" | 讀入從當(dāng)前文件指針位置開始的整個文件內(nèi)容。 |
"*i" | 讀入當(dāng)前行。 |
number | 讀入指定字節(jié)數(shù)的內(nèi)容。 |
另外一些常用的方法:
我們也會經(jīng)常用到顯示文件描述符,因為它允許我們同時操作多個文件。這些函數(shù)與隱式文件描述符非常相似,只不過我們在這兒使用 file:function_name 而不是使用 io.function_name 而已。下面的例子使用顯示文件描述符實現(xiàn)了與前面例子中完全相同的功能。
-- 只讀模式打開文件
file = io.open("test.lua", "r")
-- 輸出文件的第一行
print(file:read())
-- 關(guān)閉打開的文件
file:close()
-- 以追加模式打開文件
file = io.open("test.lua", "a")
-- 添加內(nèi)容到文件的尾行
file:write("--test")
-- 關(guān)閉打開的文件
file:close()
執(zhí)行上面的程序,我們可以得到與前面使用隱式文件描述符類似的輸出結(jié)果:
-- Sample test.lua
在顯式文件描述符中,打開文件的描述與讀文件時的參數(shù)與隱式文件描述中的完全相同。另外的常用方法包括:
下面的例子演示 seek 函數(shù)的使用方法。它將文件指針從文件末尾向前移動 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í)行上的面的程序,你可以得到類似下面的輸出結(jié)果:
sample2 test.lua
--test
你還可以嘗試不同的參數(shù)了解更多的 Lua 文件操作方法。