前言#
不知道大家在看到io.open()這一章的時候有沒有感覺到問題妒貌,其中有個很明顯的問題就是我在使用io.open()
打開文件后并沒有關(guān)閉困曙,很多人應(yīng)該知道這個問題咽筋,不過那是我故意寫的距误,就會為了今天這個函數(shù)宪拥,要不然怎么能凸顯這個函數(shù)的作用呢信夫?
一般在一些小的程序里打開一個文件而不去關(guān)閉窃蹋,當(dāng)程序結(jié)束后自然會回收回來,但這也是一個不好的習(xí)慣忙迁∑瓴剩可如果在大型程序里,有一個模塊如果總是打開文件為不去關(guān)閉的話姊扔,就會造成資源的浪費惠奸,導(dǎo)致程序運行一段時間后無法正常工作。
內(nèi)容#
io.close()##
- 原型:io.close ([file])
- 解釋:這個函數(shù)等價于
file:close()
恰梢,如果省略參數(shù)file
的話佛南,那么就表示關(guān)閉默認(rèn)輸出文件梗掰。函數(shù)file:close()
也是用來關(guān)閉文件的,只是調(diào)用形式有所不同嗅回。另外當(dāng)文件描述符被垃圾回收時及穗,對應(yīng)的文件也會自動關(guān)閉,但是這個時間是不確定的绵载。
Usage##
- 首先新建一個名叫closetest.lua的文件然后編寫如下代碼:
local file = io.open("iotest.txt","r")
print("\nopen a file:")
print(file)
-- 關(guān)閉打開的文件
local ret = io.close(file);
print("\nclose file ret:")
print(ret)
local filenew = io.open("iotest.txt","r")
print("\n\nopen a file again:")
print(filenew)
-- 換種方式再次關(guān)閉打開的文件
local retagain = filenew:close();
print("\nclose file again ret:")
print(retagain)
-- 設(shè)置并打開默認(rèn)輸出文件
io.output("iotest.txt")
local outret = io.close()
print("\nclose default out file ret:")
print(outret)
-- 設(shè)置并打開默認(rèn)輸入文件
io.input("iotest.txt")
local inret = io.close()
print("\nclose default in file ret:")
print(inret)
- 運行結(jié)果
總結(jié)#
- 保證打開文件和關(guān)閉文件成對出現(xiàn)是一個良好的習(xí)慣埂陆。
- 由結(jié)果可知函數(shù)
io.close(file)
和file:close()
完全等價,但是當(dāng)要關(guān)閉默認(rèn)輸出文件時娃豹,需要選擇io.close()
焚虱。 - 結(jié)果中最后一段報錯可能有的人不理解,原因就是
io.close()
只能用來關(guān)閉默認(rèn)的出輸出文件懂版,不能用關(guān)閉默認(rèn)的輸入文件鹃栽,而默認(rèn)的輸出文件在上面已經(jīng)關(guān)閉過了,如果嘗試再次關(guān)閉的話躯畴,Lua 解釋器就會發(fā)出報錯警告民鼓。