最近寫DEMO代碼遇到一個頻繁用到鍵盤輸入流(System.in)的場景。本着節約資源的方式,使用單例,在每次需要使用的代碼段裏初始化,用完即關。
下次再需要使用時,再打開即可。
後來發現,事情沒那麼簡單。
我先後用了2中方法初始化鍵盤輸入流。
- 通過緩衝輸入流來獲取鍵盤輸入內容(即InputStreamReader+BufferedReader);
- 通過內置Scanner工具來獲取輸入。
當在出現關閉流後再初始化的情景時,上述兩種方法分別報以下錯誤:
- IOException: stream close
- IOException: No line found
原因及處理方法:
造成這一切是因爲System.in流是一個final對象,一旦被close就無法再行初始化,從而導致異常。
處理手段爲:
- 要麼在主線程結束的最後才關閉輸入流
- 要麼整個代碼運行過程不關閉流(由於單例,不會造成太大資源浪費)