I/O 庫提供了兩套不同風格的文件處理接口。 第一種風格使用隱式的文件句柄; 它提供設置默認輸入文件及默認輸出文件的操作, 所有的輸入輸出操作都針對這些默認文件。 第二種風格使用顯式的文件句柄。
當使用隱式文件句柄時, 所有的操作都由表 io 提供。 若使用顯式文件句柄, io.open 會返回一個文件句柄,且所有的操作都由該文件句柄的方法來提供。
表 io 中也提供了三個 和 C 中含義相同的預定義文件句柄: io.stdin io.stdout io.stderr。 I/O 庫永遠不會關閉這些文件。
除非另有說明, I/O 函數在出錯時都返回 nil (第二個返回值為錯誤消息,第三個返回值為系統相關的錯誤碼)。 成功時返回與 nil 不同的值
io:open(filename [, mode])
這個函數用字符串 mode 指定的模式打開一個文件。 返回新的文件句柄。 當出錯時,返回 nil 加錯誤消息。
mode 字符串可以是下列任意值:
- **"r": **只讀模式,這也是對已存在的文件的默認打開模式。
- **"w": **可寫模式,允許修改已經存在的文件和創建新文件(不可讀)。
- **"a": **追加模式,對于已存的文件允許追加新內容,但不允許修改原有內容,同時也可以創建新文件。
- **"r+": **讀寫模式打開已存的在文件。
- **"w+": **如果文件已存在則刪除文件中數據;若文件不存在則新建文件。讀寫模式打開。
- **"a+": **以可讀的追加模式打開已存在文件,若文件不存在則新建文件。
mode 字符串可以在最后加一個 'b' , 這會在某些系統上以二進制方式打開文件。
當文件不存在時
local file = io.open("./test.txt")
file:close()
模式"r","r+",會提示錯誤,這兩種模式不會自動創建為難。
模式"a","a+","w","w+"都會創建文件
當文件存在時
原文件:
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()
對不同模式,分別調用讀寫操作
mode為"r"
Output:
寫:
nil Bad file descriptor 9
文件可讀,不可寫
mode為"r+"
Output :
true
文件內容:
123a is test 1
this is test 2
文件內容保留,新內容從文件頭輸入
可讀
mode為"w"
Output :
true
文件內容:
123a
讀:
nil No error 0
用輸入內容覆蓋文件內容
使用"w"模式打開文件時,會立即刪除文件內容,即使不寫入內容.
用"w"模式讀時,返回nil
mode為"w+"
Output:
true
文件內容:
123a
用輸入內容覆蓋文件內容
使用"w+"模式打開文件時,會立即刪除文件內容
用"w+"模式讀時,返回空字符串
mode為"a"
Output:
true
文件內容:
this is test 1
this is test 2123a
讀:
nil No error 0
追加模式寫入
不可讀
mode為"a+"
Output:
true
文件內容:
this is test 1
this is test 2123a
追加模式寫入
可讀
io:input([file])
用文件名調用它時,(以文本模式)來打開該名字的文件, 并將文件句柄設為默認輸入文件。 如果用文件句柄去調用它, 就簡單的將該句柄設為默認輸入文件。 如果調用時不傳參數,它返回當前的默認輸入文件。
在出錯的情況下,函數拋出錯誤而不是返回錯誤碼。
--文件名
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])
用文件名調用它時,(以文本模式)來打開該名字的文件, 并將文件句柄設為默認輸出文件。 如果用文件句柄去調用它, 就簡單的將該句柄設為默認輸出文件。 如果調用時不傳參數,它返回當前的默認輸出文件。
在出錯的情況下,函數拋出錯誤而不是返回錯誤碼。
print(io.output("./test.txt"))
io.write("123")
io.close()
Output:
file (777E1BD8)
文件內容:
123
io.popen (prog [, mode])
這個函數和系統有關,不是所有的平臺都提供。
用一個分離進程開啟程序 prog, 返回的文件句柄可用于從這個程序中讀取數據 (如果 mode 為 "r",這是默認值) 或是向這個程序寫入輸入(當 mode 為 "w" 時)。
io.tmpfile()
返回一個臨時文件的句柄。 這個文件以更新模式打開,在程序結束時會自動刪除。
io.type(obj)
檢查 obj 是否是合法的文件句柄。 如果 obj 它是一個打開的文件句柄,返回字符串 "file"。 如果 obj 是一個關閉的文件句柄,返回字符串 "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])
提供一個循環迭代器以遍歷文件,如果指定了文件名則當遍歷結束后將自動關閉該文件;若使用默認文件,則遍歷結束后不會自動關閉文件。
for line in io.lines("./test.txt") do
print(line)
end
Output:
this is test 1
this is test 2
注:Lua 5.3 有變動,添加模式數
file:lines()
返回一個迭代器函數, 每次調用迭代器時,都從文件中取一行數據,和 io.lines 不同, 這個函數在循環結束后不會關閉文件。
注:Lua 5.3 有變動,添加模式數
file:read(...)
讀文件 file, 指定的格式決定了要讀什么。 對于每種格式,函數返回讀出的字符對應的字符串或數字。 若不能以該格式對應讀出數據則返回 nil。 (對于最后這種情況, 函數不會讀出后續的格式。) 當調用時不傳格式,它會使用默認格式讀下一行
- *"n": ** 從文件當前位置讀入一個數字,如果該位置不為數字則返回 nil。
- *"l": ** 讀入當前行。
- *"a": ** 讀入從當前文件指針位置開始的整個文件內容。
- number: 讀入指定字節數的內容。
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 有變動,去掉*號,并添加"i"和"L"格式
io:read(...)
等價于 io.input():read(···)。
file:write(...)
將參數的值逐個寫入 file。 參數必須是字符串或數字。
成功時,函數返回 file。 否則返回 nil 加錯誤描述字符串。
io:write(...)
等價于 io.output():write(···)。
file:close()
關閉 file。 注意,文件在句柄被垃圾回收時會自動關閉, 但是多久以后發生,時間不可預期的。
io:close()
等價于 file:close()。 不給出 file 時將關閉默認輸出文件。
file:flush()
將寫入的數據保存到 file 中
io:flush()
等價于 io.output():flush()。
file:seek([whence [, offset]])
設置及獲取基于文件開頭處計算出的位置。 設置的位置由 offset 和 whence 字符串 whence 指定的基點決定。基點可以是:
- **"set": **基點為 0 (文件開頭);
- **"cur": **基點為當前位置了;
- **"end": **基點為文件尾;
當 seek 成功時,返回最終從文件開頭計算起的文件的位置。 當 seek 失敗時,返回 nil 加上一個錯誤描述字符串。
whence 的默認值是 "cur", offset 默認為 0 。 因此,調用 file:seek() 可以返回文件當前位置,并不改變它; 調用 file:seek("set") 將位置設為文件開頭(并返回 0); 調用 file:seek("end") 將位置設到文件末尾,并返回文件大小。
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
修改文件的值會影響read操作 以及以"r+"模式打開文件的write操作