2010-11-08 110 views
2

我使用springframework的Web MVC框架和servlet的handleRequestInternal裏面,我創建了一個變量來訪問一個文件中的本地文件系統,即Java文件釋放資源

protected ModelAndView handleRequestInternal(HttpServletRequest request,...... 
{ 
...... 
File file = new File(rssPath); 
if(!file.exists()) { 
    file.createNewFile(); 
    FileWriter outFile = new FileWriter(rssPath); 
    outFile.write(rssJson); 
    outFile.flush(); 
    //file = null; 
} 
} 

的問題是,如果我不設置該文件爲空,該文件仍將被使用,我不能寫入它。

我必須等待幾秒鐘,直到GC收集。

看看File API,我沒有看到任何方法,如close()釋放資源。

那麼,如何正確銷燬文件引用(沒有將其設置爲空,我是否缺少某些東西?)?

回答

5

則無法關閉文件。但是您必須關閉FileInputStream,FIleOutputStream,FileReaderFileWriter。否則,這些流(和文件句柄)將不會被GCed。 (直到持有該流的對象被GCed)

編輯: 在finally塊中執行此操作,確保關閉被調用。

+0

該死的我錯過了,關閉FileWriter!難以置信的。謝謝。 – portoalet 2010-11-08 14:15:21

+0

在finally塊中關閉一個文件並不是一個好主意:這意味着即使出現錯誤(!)你的文件也會被關閉爲了創建一個可靠的程序,如果沒有異常,你真的只想關閉它。請參閱http://agiletribe.wordpress.com/2013/07/18/surprising-outrageous-file-handling/而不是使用finally塊,最好使用catch塊並刪除可能部分寫入的文件。 – AgilePro 2013-07-18 14:29:14

+0

Streams可能會在finally塊中關閉。但是在這種情況下,如果發生異常,則必須進行某種錯誤處理。在catch-block中,仍然可能存在您在博客文章中提到的刪除文件代碼。但是代碼中仍然存在錯誤,並且該文件可能不會被刪除。如果catch()中的close()是一個例外。 – 2013-07-18 18:14:53

4

如何在FileWriter對象上使用close()方法?

outFile.close();