Lua文件I/O

Lua中I/O庫用於讀取和處理文件。有兩種類型的文件操作,在Lua即隱含文件的描述符和明確的文件描述符。

對於下面的例子中,我們將使用一個示例文件test.lua,如下圖所示。

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

一個簡單的文件打開操作使用下面的語句。

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

各種文件模式列示於下表中。

Mode

描述

"r"

只讀模式,就是打開一個現有的文件的默認模式。

"w"

寫使能模式將覆蓋現有的文件或創建一個新文件。

"a"

追加打開一個現有的文件或進行追加創建一個新的文件模式。

"r+"

讀寫方式爲現有的文件。

"w+"

如果文件存在的或新的文件讀取與寫入權限創建的所有現有數據將被刪除。

"a+"

讀模式追加模式下啓用,打開一個現有的文件或創建一個新文件。

隱文件描述符

隱文件描述符使用標準輸入/輸出模式,或使用單輸入單輸出文件。使用隱式文件的描述符的一個示例如下所示。

-- Opens a file in read
file = io.open("test.lua", "r") -- sets the default input file as test.lua
io.input(file) -- prints the first line of the file print(io.read()) -- closes the open file
io.close(file) -- Opens a file in append mode
file = io.open("test.lua", "a") -- sets the default output file as test.lua
io.output(file) -- appends a word test to the last line of the file
io.write("-- End of the test.lua file") -- closes the open file
io.close(file)

當運行程序,會得到test.lua文件的第一行輸出。這裏例子中得到了下面的輸出。

-- Sample test.lua

這是聲明 test.lua 文件的第一行。「-- End of the test.lua file」 將被追加到test.lua代碼的最後一行

在上面的例子中可以看到隱描述與使用文件系統io.「×」方法是如何工作的。上面的例子使用io.read()沒有可選參數。可選參數可以是以下任意一個。

Mode

描述

"*n"

讀取當前文件的位置,如果存在於文件的位置返回一個數字,或返回nil。

"*a"

返回文件的所有從當前文件位置的內容。

"*l"

讀取當前文件位置的對應行,並且移動文件位置下一行。

number

讀函數中指定的字節數。

其他常見的IO方法包括:

  • io.tmpfile():  返回讀寫臨時文件,一旦程序退出,文件將被刪除。

  • io.type(file):  返回文件,關閉文件或零根據所輸入的文件。

  • io.flush(): 清除默認輸出緩衝器。

  • io.lines(optional file name): 提供了一個通用的循環迭代器遍歷文件並關閉在最後的情況下提供文件名和默認文件的文件被使用,在循環的末尾沒有關閉。

明確的文件描述符

我們經常使用明確的文件描述符,使我們能夠在同一時間處理多個文件。這些功能都相當相似的隱式文件描述符。在這裏,我們使用的文件:函數名,而不是io.function_name。同樣地隱文件描述符例的文件版本,以下示例如下所示。

-- Opens a file in read mode
file = io.open("test.lua", "r") -- prints the first line of the file print(file:read()) -- closes the opened file
file:close() -- Opens a file in append mode
file = io.open("test.lua", "a") -- appends a word test to the last line of the file
file:write("--test") -- closes the open file
file:close()

當運行程序,會得到的隱含描述的例子是類似的輸出。

-- Sample test.lua

文件打開和參數進行讀取外部描述的所有的模式是一樣的隱含文件的描述符。

其他常見的文件的方法包括:

  • file:seek(optional whence, optional offset): 參數"set", "cur" 或 "end"。設置新的文件指針從文件的開始更新的文件的位置。偏移量是零基礎的這個功能。從如果第一個參數是「set」該文件的開始時所測的偏移量;從如果它是「cur」 文件中的當前位置;或從該文件的結束,如果是「end」。默認參數值是「cur」和0,因此當前的文件位置可以通過調用不帶參數這個函數來獲得。

  • file:flush(): 清除默認輸出緩衝器。

  • io.lines(optional file name): 提供了一個通用的循環迭代器遍歷文件並關閉在最後的情況下提供文件名和默認文件的文件被使用,在循環的末尾沒有關閉。

一個例子,以使用尋求方法如下所示。offsets從25個位置的光標之前的文件的末尾。從文件的讀出功能的打印剩餘 seek 位置。

-- 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()

會得到類似下面的一些輸出。

sample2 test.lua
--test

可以使用各種不同的模式和參數瞭解 Lua文件操作能力。