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

文件 I/O

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)容。

另外一些常用的方法:

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

顯示文件描述符

我們也會經(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ù)與隱式文件描述中的完全相同。另外的常用方法包括:

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

下面的例子演示 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 文件操作方法。

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