Kotlin Tips(1) Kotlin的readText()方法會自動關閉IO流嗎?

readText()方法介紹

readText()是kotlin爲一些IO操做類提供的拓展方法,方便讀取IO內容 常見使用:安全

val contents = File("pathname").readText()
 val contents = URL("url").readText()
複製代碼

經過調用readText()能夠直接獲取文件或URL的內容bash

上述使用方式IO流會自動關閉嗎?

咱們知道不管是File仍是URL其實都過IO流去讀取讀取內容的,那使readText()是否會形成IO流未關閉呢? 經過觀察源碼: 函數

看到這裏,我恍然大悟,他們 readText()都調用了 readBytes()方法,而 readBytes()方法拿到Stream後經過調用use擴展函數來完成相關操做,而對use函數,則會對Closeable自動close
因此答案是確定的,上述的方法IO流會自動關閉

全部的readText()拓展方法都會關閉IO流嗎?

首先,我也是偶然發現這個問題的,當咱們把代碼this

val contents = File("pathname").readText()
複製代碼

更換爲url

val contents = File("file").reader().readText()
複製代碼

reader()方法返回一個InputStreamReader對象,運行一下,結果都同樣,可是此時咱們點開readText()方法 spa

能夠看到這裏沒有使用到use函數,故IO流不會自動關閉,源碼更是直接在註釋裏提醒了:code

Note: It is the caller's responsibility to close this reader.cdn

因此這種使用方式是不安全的,若是非要使用reader()方法,那麼也應該用下面的寫法對象

val contents = File("filename").inputStream().use { 
    it.reader().readText()
}
複製代碼
相關文章
相關標籤/搜索