2015-11-03 49 views
1

我只想清除一段時間以來我一直懷有的懷疑:即使代碼中沒有調用.close()方法,是否可以關閉Java中的套接字?可以用socket.close()以外的其他方式關閉套接字嗎?

+0

on'System.exit()',或者可以使用'try-with-resources'自動關閉 – sidgate

+0

好問題。如果您關閉套接字的輸入和輸出流,會發生什麼情況?這相當於關閉套接字嗎? – aioobe

+0

請定義* closed *'如果之前調用過'Socket.close()',則Socket.isClosed()'只返回true。 – wero

回答

1

是的。關閉套接字的輸入或輸出流會關閉另一個流和套接字。

+0

這個答案依賴於實現嗎?或者你可以提供一個參考文檔? – aioobe

+0

它不依賴於實現。我參考的是Javadoc中的明確聲明。 – EJP

1

這下面的代碼是在java.net.AbstractPlainSocketImpl

/** 
* Cleans up if the user forgets to close it. 
*/ 
protected void finalize() throws IOException { 
    close(); 
} 

的finalize()運行垃圾收集器時被調用。所以如果你失去了所有對你的Socket的引用,它將被關閉。你不應該這樣做,因爲這是不好的做法 - 你永遠不知道垃圾收集器何時運行,所以套接字可以保持一段時間。我真的不知道這是否值得,因爲它確實在下面調用close()。關閉輸入和輸出流與套接字不同。我不認爲他們真的數。

+0

關閉輸入或輸出蒸汽關閉插座。從這個角度來看沒有什麼區別。 – EJP

相關問題