OpenResty Lua 文件操作

2021-10-08 14:40 更新

Lua I/O 庫(kù)提供兩種不同的方式處理文件:隱式文件描述,顯式文件描述。

這些文件 I/O 操作,在 OpenResty 的上下文中對(duì)事件循環(huán)是會(huì)產(chǎn)生阻塞效應(yīng)。OpenResty 比較擅長(zhǎng)的是高并發(fā)網(wǎng)絡(luò)處理,在這個(gè)環(huán)境中,任何文件的操作,都將阻塞其他并行執(zhí)行的請(qǐng)求。實(shí)際中的應(yīng)用,在 OpenResty 項(xiàng)目中應(yīng)盡可能讓網(wǎng)絡(luò)處理部分、文件 I/0 操作部分相互獨(dú)立,不要揉和在一起。

隱式文件描述

設(shè)置一個(gè)默認(rèn)的輸入或輸出文件,然后在這個(gè)文件上進(jìn)行所有的輸入或輸出操作。所有的操作函數(shù)由 io 表提供。

打開已經(jīng)存在的 test1.txt 文件,并讀取里面的內(nèi)容
file = io.input("test1.txt")    -- 使用 io.input() 函數(shù)打開文件

repeat
    line = io.read()            -- 逐行讀取內(nèi)容,文件結(jié)束時(shí)返回nil
    if nil == line then
        break
    end
    print(line)
until (false)

io.close(file)                  -- 關(guān)閉文件

--> output
my test file
hello
lua
在 test1.txt 文件的最后添加一行 "hello world"
file = io.open("test1.txt", "a+")   -- 使用 io.open() 函數(shù),以添加模式打開文件
io.output(file)                     -- 使用 io.output() 函數(shù),設(shè)置默認(rèn)輸出文件
io.write("\nhello world")           -- 使用 io.write() 函數(shù),把內(nèi)容寫到文件
io.close(file)

在相應(yīng)目錄下打開 test1.txt 文件,查看文件內(nèi)容發(fā)生的變化。

顯式文件描述

使用 file:XXX() 函數(shù)方式進(jìn)行操作, 其中 file 為 io.open() 返回的文件句柄。

打開已經(jīng)存在的 test2.txt 文件,并讀取里面的內(nèi)容
file = io.open("test2.txt", "r")    -- 使用 io.open() 函數(shù),以只讀模式打開文件

for line in file:lines() do         -- 使用 file:lines() 函數(shù)逐行讀取文件
   print(line)
end

file:close()

-->output
my test2
hello lua
在 test2.txt 文件的最后添加一行 "hello world"
file = io.open("test2.txt", "a")  -- 使用 io.open() 函數(shù),以添加模式打開文件
file:write("\nhello world")       -- 使用 file:write() 函數(shù),在文件末尾追加內(nèi)容
file:close()

在相應(yīng)目錄下打開 test2.txt 文件,查看文件內(nèi)容發(fā)生的變化。

文件操作函數(shù)

io.open (filename [, mode])

按指定的模式 mode,打開一個(gè)文件名為 filename 的文件,成功則返回文件句柄,失敗則返回 nil 加錯(cuò)誤信息。模式:

模式含義文件不存在時(shí)
"r"讀模式 (默認(rèn))返回nil加錯(cuò)誤信息
"w"寫模式創(chuàng)建文件
"a"添加模式創(chuàng)建文件
"r+"更新模式,保存之前的數(shù)據(jù)返回nil加錯(cuò)誤信息
"w+"更新模式,清除之前的數(shù)據(jù)創(chuàng)建文件
"a+"添加更新模式,保存之前的數(shù)據(jù),在文件尾進(jìn)行添加創(chuàng)建文件

模式字符串后面可以有一個(gè) 'b',用于在某些系統(tǒng)中打開二進(jìn)制文件。

注意 "w" 和 "wb" 的區(qū)別

  • "w" 表示文本文件。某些文件系統(tǒng)(如 Linux 的文件系統(tǒng))認(rèn)為 0x0A 為文本文件的換行符,Windows 的文件系統(tǒng)認(rèn)為 0x0D0A 為文本文件的換行符。為了兼容其他文件系統(tǒng)(如從 Linux 拷貝來(lái)的文件),Windows 的文件系統(tǒng)在寫文件時(shí),會(huì)在文件中 0x0A 的前面加上 0x0D。使用 "w",其屬性要看所在的平臺(tái)。
  • "wb" 表示二進(jìn)制文件。文件系統(tǒng)會(huì)按純粹的二進(jìn)制格式進(jìn)行寫操作,因此也就不存在格式轉(zhuǎn)換的問(wèn)題。(Linux 文件系統(tǒng)下 "w" 和 "wb" 沒(méi)有區(qū)別)

file:close ()

關(guān)閉文件。注意:當(dāng)文件句柄被垃圾收集后,文件將自動(dòng)關(guān)閉。句柄將變?yōu)橐粋€(gè)不可預(yù)知的值。

io.close ([file])

關(guān)閉文件,和 file:close() 的作用相同。沒(méi)有參數(shù) file 時(shí),關(guān)閉默認(rèn)輸出文件。

file:flush ()

把寫入緩沖區(qū)的所有數(shù)據(jù)寫入到文件 file 中。

io.flush ()

相當(dāng)于 file:flush(),把寫入緩沖區(qū)的所有數(shù)據(jù)寫入到默認(rèn)輸出文件。

io.input ([file])

當(dāng)使用一個(gè)文件名調(diào)用時(shí),打開這個(gè)文件(以文本模式),并設(shè)置文件句柄為默認(rèn)輸入文件; 當(dāng)使用一個(gè)文件句柄調(diào)用時(shí),設(shè)置此文件句柄為默認(rèn)輸入文件; 當(dāng)不使用參數(shù)調(diào)用時(shí),返回默認(rèn)輸入文件句柄。

file:lines ()

返回一個(gè)迭代函數(shù), 每次調(diào)用將獲得文件中的一行內(nèi)容, 當(dāng)?shù)轿募矔r(shí),將返回 nil,但不關(guān)閉文件。

io.lines ([filename])

打開指定的文件 filename 為讀模式并返回一個(gè)迭代函數(shù), 每次調(diào)用將獲得文件中的一行內(nèi)容, 當(dāng)?shù)轿募矔r(shí),將返回 nil,并自動(dòng)關(guān)閉文件。若不帶參數(shù)時(shí) io.lines() 等價(jià)于 io.input():lines() 讀取默認(rèn)輸入設(shè)備的內(nèi)容,結(jié)束時(shí)不關(guān)閉文件。

io.output ([file])

類似于 io.input,但操作在默認(rèn)輸出文件上。

file:read (...)

按指定的格式讀取一個(gè)文件。按每個(gè)格式將返回一個(gè)字符串或數(shù)字, 如果不能正確讀取將返回 nil,若沒(méi)有指定格式將指默認(rèn)按行方式進(jìn)行讀取。格式:

格式含義
"*n"讀取一個(gè)數(shù)字
"*a"從當(dāng)前位置讀取整個(gè)文件。若當(dāng)前位置為文件尾,則返回空字符串
"*l"讀取下一行的內(nèi)容。若為文件尾,則返回nil。(默認(rèn))
number讀取指定字節(jié)數(shù)的字符。若為文件尾,則返回nil。如果number為0,則返回空字符串,若為文件尾,則返回nil

io.read (...)

相當(dāng)于 io.input():read

io.type (obj)

檢測(cè) obj 是否一個(gè)可用的文件句柄。如果 obj 是一個(gè)打開的文件句柄,則返回 "file" 如果 obj 是一個(gè)已關(guān)閉的文件句柄,則返回 "closed file" 如果 obj 不是一個(gè)文件句柄,則返回 nil。

file:write (...)

把每一個(gè)參數(shù)的值寫入文件。參數(shù)必須為字符串或數(shù)字,若要輸出其它值,則需通過(guò) tostring 或 string.format 進(jìn)行轉(zhuǎn)換。

io.write (...)

相當(dāng)于 io.output():write。

file:seek ([whence] [, offset])

設(shè)置和獲取當(dāng)前文件位置,成功則返回最終的文件位置(按字節(jié),相對(duì)于文件開頭),失敗則返回 nil 加錯(cuò)誤信息。缺省時(shí),whence 默認(rèn)為 "cur",offset 默認(rèn)為 0 。 參數(shù) whence:

whence含義
"set"文件開始
"cur"文件當(dāng)前位置(默認(rèn))
"end"文件結(jié)束

file:setvbuf (mode [, size])

設(shè)置輸出文件的緩沖模式。模式:

模式含義
"no"沒(méi)有緩沖,即直接輸出
"full"全緩沖,即當(dāng)緩沖滿后才進(jìn)行輸出操作(也可調(diào)用flush馬上輸出)
"line"以行為單位,進(jìn)行輸出

最后兩種模式,size 可以指定緩沖的大?。ò醋止?jié)),忽略 size 將自動(dòng)調(diào)整為最佳的大小。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)