Lua 文件 I/O 提供兩種模型:**簡單模型** (隱式默認文件、類 C 標準 I/O) 與 **完整模型** (顯式文件句柄、支持二進制、隨機訪問)。本文系統對比兩模型 API、適用場景,並給出完整示例。
| 函數 | 說明 |
|---|---|
io.input([file]) | 設置默認輸入文件,參數為文件名(文本模式)或句柄,返回句柄 |
io.output([file]) | 設置默認輸出文件,同理 |
io.close([file]) | 關閉默認或指定文件 |
io.read(formats...) | 讀取默認輸入:"*a"全文、"*l"行(默認)、"*n"數字、n字符數 |
io.lines([filename]) | 返回迭代器,for line in io.lines() do ... end |
io.write(values...) | 寫入默認輸出 |
io.flush() | 刷新默認輸出緩衝區 |
限制:僅支持**文本模式**,無法處理二進制文件、無法隨機訪問 (seek)。
流程:**打開 → 句柄操作 → 關閉**。
| 函數/方法 | 說明 |
|---|---|
io.open(filename, mode) | 打開文件返回句柄。模式:r讀、w寫(截斷)、a追加、r+讀寫、w+讀寫(截斷)、a+追加讀寫、b二進制 |
file:close() | 關閉文件 |
file:read(formats...) | 同 io.read |
file:lines() | 返回迭代器 |
file:write(values...) | 同 io.write |
file:seek(whence, offset) | 隨機訪問:whence="set/cur/end",offset偏移量,返回新位置 |
file:flush() | 刷新緩衝區 |
-- ========== 簡單模型 ==========
-- 讀取
local f1 = io.input("1.txt") -- 必須存在
local content = io.read("*a")
print(content)
-- 寫入
local f2 = io.output("2.txt") -- 不存在自動創建
io.write(content)
io.flush()
io.close()
-- 文件複製函數
function copy_simple(src, dst)
local f = io.input(src)
if not f then print(src .. " 不存在") return end
local data = io.read("*a")
io.output(dst)
io.write(data)
io.flush()
io.close()
end
-- 逐行迭代
for line in io.lines("1.txt") do print(line) end
-- ========== 完整模型 ==========
local f = io.open("3.txt", "a+") -- 追加讀寫,不存在創建
f:write("Happy New Year!")
f:flush()
f:seek("end", -1) -- 定位到末尾前1字節
local last_char = f:read(1) -- 讀取1字符
print(last_char) -- 輸出 "!"
f:close()
io.open 顯式管理生命周期,避免隱式默認文件導致的並發/嵌套調用錯誤。Lua 文件 I/O 雙模型設計兼顧**簡潔性**與**功能完整性**。理解 io.open 模式字符串、seek 隨機訪問、read("*a") 全文讀取、lines() 迭代器,能應對 99% 文件處理場景。**建議項目統一封裝 file_utils 模塊,內部用完整模型,對外提供簡潔 API。**