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

Bimo發表於2019-04-19

readText()方法介紹

readText()是kotlin為一些IO操作類提供的擴充方法,方便讀取IO內容 常見使用:

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

通過呼叫readText()可以直接獲取檔案或URL的內容

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

我們知道無論是File還是URL其實都過IO流去讀取讀取內容的,那使readText()是否會造成IO流未關閉呢? 通過觀察原始碼:

Kotlin Tips(1)    Kotlin的readText()方法會自動關閉IO流嗎?
看到這裡,我恍然大悟,他們readText()都呼叫了readBytes()方法,而readBytes()方法拿到Stream後通過呼叫use擴充套件函式來完成相關操作,而對use函式,則會對Closeable自動close
Kotlin Tips(1)    Kotlin的readText()方法會自動關閉IO流嗎?
所以答案是肯定的,上述的方法IO流會自動關閉

所有的readText()擴充方法都會關閉IO流嗎?

首先,我也是偶然發現這個問題的,當我們把程式碼

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

更換為

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

reader()方法返回一個InputStreamReader物件,執行一下,結果都一樣,但是此時我們點開readText()方法

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

可以看到這裡沒有使用到use函式,故IO流不會自動關閉,原始碼更是直接在註釋裡提醒了:

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

所以這種使用方式是不安全的,如果非要使用reader()方法,那麼也應該用下面的寫法

val contents = File("filename").inputStream().use { 
    it.reader().readText()
}
複製程式碼

相關文章