# 文件操作
lua I/O庫提供兩種不同的方式處理文件:
1、隱式文件描述:設置一個默認的輸入或輸出文件,然后在這個文件上進行所有的輸入或輸出操作。所有的操作函數由io表提供。
> 打開已經存在的test1.txt文件,并讀取里面的內容
~~~
file = io.input("test1.txt") --使用io.input()函數打開文件
repeat
line = io.read() --逐行讀取內容,文件結束時返回nil
if nil == line then
break
end
print(line)
until (false)
io.close(file) --關閉文件
-->output
my test file
hello
lua
~~~
> 在test1.txt文件的最后添加一行"hello world"
~~~
file = io.open("test1.txt", "a+") --使用io.open()函數,以添加模式打開文件
io.output(file) --使用io.output()函數,設置默認輸出文件
io.write("\nhello world") --使用io.write()函數,把內容寫到文件
io.close(file)
~~~
在相應目錄下打開test1.txt文件,查看文件內容發生的變化。
2、顯示文件描述:使用file:XXX()函數方式進行操作,其中file為io.open()返回的文件句柄。
> 打開已經存在的test2.txt文件,并讀取里面的內容
~~~
file = io.open("test2.txt", "r") --使用io.open()函數,以只讀模式打開文件
for line in file:lines() do --使用file:lines()函數逐行讀取文件
print(line)
end
file:close()
-->output
my test2
hello lua
~~~
> 在test2.txt文件的最后添加一行"hello world"
~~~
file = io.open("test2.txt", "a") --使用io.open()函數,以添加模式打開文件
file:write("\nhello world") --使用file:open()函數,在文件的最后添加一行內容
file:close()
~~~
在相應目錄下打開test2.txt文件,查看文件內容發生的變化。
### 文件操作函數
#### io.open (filename [, mode])
按指定的模式mode,打開一個文件名為filename的文件,成功則返回文件句柄,失敗則返回nil加錯誤信息。模式:
| 模式 | 含義 | 文件不存在時 |
|-----|-----|-----|
| "r" | 讀模式 (默認) | 返回nil加錯誤信息 |
| "w" | 寫模式 | 創建文件 |
| "a" | 添加模式 | 創建文件 |
| "r+" | 更新模式,保存之前的數據 | 返回nil加錯誤信息 |
| "w+" | 更新模式,清除之前的數據 | 創建文件 |
| "a+" | 添加更新模式,保存之前的數據,在文件尾進行添加 | 創建文件 |
模式字符串后面可以有一個'b',用于在某些系統中打開二進制文件。
#### file:close ()
關閉文件。注意:當文件句柄被垃圾收集后,文件將自動關閉。句柄將變為一個不可預知的值。
#### io.close ([file])
關閉文件,和file:close()的作用相同。沒有參數file時,關閉默認輸出文件。
#### file:flush ()
把寫入緩沖區的所有數據寫入到文件file中。
#### io.flush ()
相當于file:flush(),把寫入緩沖區的所有數據寫入到默認輸出文件。
#### io.input ([file])
當使用一個文件名調用時,打開這個文件(以文本模式),并設置文件句柄為默認輸入文件;當使用一個文件句柄調用時,設置此文件句柄為默認輸入文件;當不使用參數調用時,返回默認輸入文件句柄。
#### file:lines ()
返回一個迭代函數,每次調用將獲得文件中的一行內容,當到文件尾時,將返回nil,但不關閉文件。
#### io.lines ([filename])
打開指定的文件filename為讀模式并返回一個迭代函數,每次調用將獲得文件中的一行內容,當到文件尾時,將返回nil,并自動關閉文件。若不帶參數時io.lines() 等價于io.input():lines(); 讀取默認輸入設備的內容,結束時不關閉文件。
#### io.output ([file])
類似于io.input,但操作在默認輸出文件上。
#### file:read (···)
按指定的格式讀取一個文件。按每個格式將返回一個字符串或數字,如果不能正確讀取將返回nil,若沒有指定格式將指默認按行方式進行讀取。格式:
| 格式 | 含義 |
|-----|-----|
| "*n" | 讀取一個數字 |
| "*a" | 從當前位置讀取整個文件。若當前位置為文件尾,則返回空字符串 |
| "*l" | 讀取下一行的內容。若為文件尾,則返回nil。(默認) |
| number | 讀取指定字節數的字符。若為文件尾,則返回nil。如果number為0,則返回空字符串,若為文件尾,則返回nil |
#### io.read (···)
相當于io.input():read
#### io.type (obj)
檢測obj是否一個可用的文件句柄。如果obj是一個打開的文件句柄,則返回"file";如果obj是一個已關閉的文件句柄,則返回"closed file";如果obj不是一個文件句柄,則返回nil。
#### file:write (···)
把每一個參數的值寫入文件。參數必須為字符串或數字,若要輸出其它值,則需通過tostring或string.format進行轉換。
#### io.write (···)
相當于io.output():write。
#### file:seek ([whence] [, offset])
設置和獲取當前文件位置,成功則返回最終的文件位置(按字節,相對于文件開頭),失敗則返回nil加錯誤信息。缺省時,whence默認為"cur",offset默認為0。參數whence:
| whence | 含義 |
|-----|-----|
| "set" | 文件開始 |
| "cur" | 文件當前位置(默認) |
| "end" | 文件結束 |
#### file:setvbuf (mode [, size])
設置輸出文件的緩沖模式。模式:
| 模式 | 含義 |
|-----|-----|
| "no" | 沒有緩沖,即直接輸出 |
| "full" | 全緩沖,即當緩沖滿后才進行輸出操作(也可調用flush馬上輸出) |
| "line" | 以行為單位,進行輸出 |
最后兩種模式,size可以指定緩沖的大小(按字節),忽略size將自動調整為最佳的大小。
- 序
- Lua簡介
- Lua環境搭建
- 基礎數據類型
- 表達式
- 控制結構
- if/else
- while
- repeat
- 控制結構for的使用
- break,return
- Lua函數
- 函數的定義
- 函數的參數
- 函數的返回值
- 函數回調
- 模塊
- String庫
- Table庫
- 日期時間函數
- 數學庫函數
- 文件操作
- 元表
- 面向對象編程
- FFI
- LuaRestyRedisLibrary
- select+set_keepalive組合操作引起的數據讀寫錯誤
- redis接口的二次封裝(簡化建連、拆連等細節)
- redis接口的二次封裝(發布訂閱)
- pipeline壓縮請求數量
- script壓縮復雜請求
- LuaCjsonLibrary
- json解析的異常捕獲
- 稀疏數組
- 空table編碼為array還是object
- 跨平臺的庫選擇
- PostgresNginxModule
- 調用方式簡介
- 不支持事務
- 超時
- 健康監測
- SQL注入
- LuaNginxModule
- 執行階段概念
- 正確的記錄日志
- 熱裝載代碼
- 阻塞操作
- 緩存
- sleep
- 定時任務
- 禁止某些終端訪問
- 請求返回后繼續執行
- 調試
- 調用其他C函數動態庫
- 我的lua代碼需要調優么
- 變量的共享范圍
- 動態限速
- shared.dict 非隊列性質
- 如何添加自己的lua api
- 正確使用長鏈接
- 如何引用第三方resty庫
- 使用動態DNS來完成HTTP請求
- 緩存失效風暴
- Lua
- 下標從1開始
- 局部變量
- 判斷數組大小
- 非空判斷
- 正則表達式
- 不用標準庫
- 虛變量
- 函數在調用代碼前定義
- 抵制使用module()函數來定義Lua模塊
- 點號與冒號操作符的區別
- 測試
- 單元測試
- API測試
- 性能測試
- 持續集成
- 灰度發布
- web服務
- API的設計
- 數據合法性檢測
- 協議無痛升級
- 代碼規范
- 連接池
- c10k編程
- TIME_WAIT問題
- 與Docker使用的網絡瓶頸
- 火焰圖
- 什么時候使用
- 顯示的是什么
- 如何安裝火焰圖生成工具
- 如何定位問題