readText()
是kotlin爲一些IO操做類提供的拓展方法,方便讀取IO內容 常見使用:安全
val contents = File("pathname").readText() val contents = URL("url").readText() 複製代碼
經過調用readText()
能夠直接獲取文件或URL的內容bash
咱們知道不管是File仍是URL其實都過IO流去讀取讀取內容的,那使readText()
是否會形成IO流未關閉呢? 經過觀察源碼: markdown
readText()
都調用了
readBytes()
方法,而
readBytes()
方法拿到Stream後經過調用use擴展函數來完成相關操做,而對use函數,則會對Closeable自動close
因此答案是確定的,上述的方法IO流會自動關閉
首先,我也是偶然發現這個問題的,當咱們把代碼函數
val contents = File("pathname").readText() 複製代碼
更換爲this
val contents = File("file").reader().readText() 複製代碼
reader()
方法返回一個InputStreamReader對象,運行一下,結果都同樣,可是此時咱們點開readText()
方法 url
能夠看到這裏沒有使用到use函數,故IO流不會自動關閉,源碼更是直接在註釋裏提醒了:spa
Note: It is the caller's responsibility to close this reader.code
因此這種使用方式是不安全的,若是非要使用reader()
方法,那麼也應該用下面的寫法orm
val contents = File("filename").inputStream().use { it.reader().readText() } 複製代碼