首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Lua 文件讀寫完全指南:簡單模型 vs 完整模型

     編輯:更多程式設計知識

Lua 文件 I/O 提供兩種模型:**簡單模型** (隱式默認文件、類 C 標準 I/O) 與 **完整模型** (顯式文件句柄、支持二進制、隨機訪問)。本文系統對比兩模型 API、適用場景,並給出完整示例。

1. 簡單模型 (隱式默認文件)

函數說明
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)。

2. 完整模型 (顯式文件句柄)

流程:**打開 → 句柄操作 → 關閉**。

函數/方法說明
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()刷新緩衝區

3. 完整示例


-- ========== 簡單模型 ==========
-- 讀取
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()

4. 選型建議

  • 文本文件、順序讀寫、腳本速寫 → 簡單模型,代碼極短。
  • 二進制文件、隨機讀寫、需要 seek、高性能、大文件 → 完整模型,功能完整。
  • 現代最佳實踐:統一使用完整模型,io.open 顯式管理生命周期,避免隱式默認文件導致的並發/嵌套調用錯誤。

總結

Lua 文件 I/O 雙模型設計兼顧**簡潔性**與**功能完整性**。理解 io.open 模式字符串、seek 隨機訪問、read("*a") 全文讀取、lines() 迭代器,能應對 99% 文件處理場景。**建議項目統一封裝 file_utils 模塊,內部用完整模型,對外提供簡潔 API。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved