2013-10-08 97 views

回答

3

如果我做outputStream = null,這會導致資源泄漏?

可能是的,儘管它取決於流(最終)連接到什麼。

另一個問題是它是否重要。這也要看...

  • 如果流包括輸出管道緩衝,然後分配null的,而不是關閉可能會導致緩存數據丟失。

  • 如果您反覆這樣做,泄漏的資源可能會累積,最終導致您的應用程序失敗,因爲它已用完「文件描述符」。另一方面,如果您緩慢地泄漏資源,則有可能在「文件描述符」短缺之前流將被垃圾收集並最終確定。 (該finalize()方法調用close() ...)

但無論哪種方式,它是最佳實踐打電話close() ......並確保關閉總是發生用「嘗試/終於「或」嘗試資源「。指定null而不是打電話close()正在尋求麻煩。

4

總是close您的流。

Stream不僅是像普通java堆一樣的普通對象,它處理底層的寫入操作系統。

然後沖洗也不會發生,如果你讓你的參考null

見密切

刷新的文檔輸出流,並強制任何緩衝的輸出字節被寫出。 flush的一般契約是,調用它表明,如果先前寫入的任何字節已被輸出流的實現緩衝,則應立即將這些字節寫入其預定目標。

那麼,關於上述過程中如果你只是做reference簡單null?如果您正在使用java7

你的問題將不會從JDK7

提高,即The try-with-resources Statement,那麼你將永遠不會有明確關閉流。

+0

@suresh atta我們使用Java JDK 1.5.0_22。在jdk7之前是否有與try-with-resources聲明等價的內容? – ravikuwi

+1

@ravikuwi沒有號碼它在Jdk 1.7中引入。對於以下版本,您可以調用'close()'。有一件事我想問一下,調用close()怎麼了? –

0

不知道outputStream的實現,很難回答你的問題。但請記住,當您將變量設置爲null時,您並未消除該變量最初指向的對象。將東西設置爲null並不等同於在C++中調用delete,或者在Objective-C中釋放。沒有自動調用的清理代碼。這正是close()首先存在的原因。你可以假設它既然存在,它就可以用來完成它所說的 - 清理資源。

總之答案是肯定的,那可能會泄漏資源。調用打算要求清理的方法!

0

通過將jsut設置爲null的引用,您不會釋放基礎文件句柄。這意味着你依賴於垃圾收集器和終結來做到這一點,這很可能會導致運行時錯誤,因爲如果終結不能跟上,操作系統將耗盡文件句柄。此外,它不會確定您寫入流的內容何時會將其寫入磁盤。