readText()方法介紹
readText()
是kotlin為一些IO操作類提供的擴充方法,方便讀取IO內容
常見使用:
val contents = File("pathname").readText()
val contents = URL("url").readText()
複製程式碼
通過呼叫readText()
可以直接獲取檔案或URL的內容
上述使用方式IO流會自動關閉嗎?
我們知道無論是File還是URL其實都過IO流去讀取讀取內容的,那使readText()
是否會造成IO流未關閉呢?
通過觀察原始碼:
readText()
都呼叫了readBytes()
方法,而readBytes()
方法拿到Stream後通過呼叫use擴充套件函式來完成相關操作,而對use函式,則會對Closeable自動close
所以答案是肯定的,上述的方法IO流會自動關閉
所有的readText()擴充方法都會關閉IO流嗎?
首先,我也是偶然發現這個問題的,當我們把程式碼
val contents = File("pathname").readText()
複製程式碼
更換為
val contents = File("file").reader().readText()
複製程式碼
reader()
方法返回一個InputStreamReader物件,執行一下,結果都一樣,但是此時我們點開readText()
方法
可以看到這裡沒有使用到use函式,故IO流不會自動關閉,原始碼更是直接在註釋裡提醒了:
Note: It is the caller's responsibility to close this reader.
所以這種使用方式是不安全的,如果非要使用reader()
方法,那麼也應該用下面的寫法
val contents = File("filename").inputStream().use {
it.reader().readText()
}
複製程式碼