2021/9/22-java中Scanner對象的關閉使用


如果在代碼中關閉了Scanner,也就是調用了Scanner.close()這個方法,那么在接下來的代碼中將無法再使用Scanner,即便再次聲明了一個新的Scanner對象也是如此。

首先Scanner的close()方法會關閉System.in,也就是Scanner對象在被初始化時所傳入的參數。

System.in是一個final常量,所以在整個方法中只會被實例化一次。

這也就導致了在第二次創建Scanner對象的時候並沒有一個全新的System.in被傳入,而是一個已經被關閉了的System.in。

那么是否能夠重新打開System.in呢?

就目前查到的資料中表示System.in在被關閉后並不能重新打開,對於具體原因還不清楚。

所以如果要關閉Scanner的話一定要確保在同一方法下接下來不會再調用Scanner來接受輸入。

接下來是為什么要關閉Scanner。

我們之所以要關閉Scanner是因為System.in在被第一次聲明時會打開InputStream,而輸入流是非常占據內存的,為此我們通常為了節省內存考慮會選擇調用Scanner.close()來關閉輸入流,從而節省內存。

如果一個方法中創建了Scanner對象,卻沒有關閉,那么在方法結束后,Scanner對象雖然會進入被回收的隊列中,但不是立刻回收。而這會給計算機帶來一定的負擔,為了避免造成大量的內存占據,至少在方法結束前應該調用Scanner的close()方法。

例如:

public int run(){

Scanner sc = new Scanner(System.in);//創建Scanner對象

int i = sc.nextInt();

//代碼塊(其中再次調用了sc)

sc.close()//關閉Scanner,也就是關閉輸入流

//如果不寫sc.close()的話盡管sc同樣會在一段時間后被回收,但如果run函數被大量重復調用的話,就會導致一定程度的內存浪費

return i;

}

需要注意的是,如果函數中有多個地方可能會結束方法,那么要在每次結束前確保Scanner對象被close了。

但如果能夠保證接下來的部分不會在運用到Scanner,也可以提早進行Scanner的close()方法的調用。

這也就是為什么Scanner的close()不是總被放在最后的原因。

同時Scanner在方法中也占據了一定的內存,會影響到運行,能夠及早釋放也會更好。

例如:

public int run(){

Scanner sc = new Scanner(System.in);//創建Scanner對象

int i = sc.nextInt();

sc.close()//關閉Scanner

//代碼塊(其中沒有調用sc)

return i;

}

這樣可以進一步節省內存,也保證了不用擔心后面會出現突然結束方法而沒有關閉Scanner的情況。

ps:雖然這樣就要注意是否要再次調用Scanner了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM