關於System.in流的關閉問題

最近寫DEMO代碼遇到一個頻繁用到鍵盤輸入流(System.in)的場景。本着節約資源的方式,使用單例,在每次需要使用的代碼段裏初始化,用完即關。

下次再需要使用時,再打開即可。

後來發現,事情沒那麼簡單。


 我先後用了2中方法初始化鍵盤輸入流。

  1. 通過緩衝輸入流來獲取鍵盤輸入內容(即InputStreamReader+BufferedReader);
  2. 通過內置Scanner工具來獲取輸入。

當在出現關閉流後再初始化的情景時,上述兩種方法分別報以下錯誤:

  • IOException: stream close
  • IOException: No line found

原因及處理方法:

造成這一切是因爲System.in流是一個final對象,一旦被close就無法再行初始化,從而導致異常。

處理手段爲:

  1. 要麼在主線程結束的最後才關閉輸入流
  2. 要麼整個代碼運行過程不關閉流(由於單例,不會造成太大資源浪費)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章