4. 清除資源
在將文件項封裝成FileItem 對象時,如果文件尺寸大于臨界值,將會被寫入臨時文件。 當這些臨時
文件不再被使用時會被自動刪除(更確切地說, java.io.File的實例會被垃圾收集器收集)。 這項工作
由一個叫做收割機的后臺線程來完成,該線程由org.apache.commons.io.FileCleaner類啟動。 為了確保這個
后臺線程在它不再被需要時需要被停止,在 servlet 環境里,我們通過一個名叫 FileCleanerCleanup 的 s
ervlet 上下文監聽器,在web應用關閉時調用FileCleaningTracker.exitWhenFinished()來終止收割機線
程。要讓FileCleanerCleanup監聽器工作,你需要在 web.xml 增加如下代碼:
<web-app>
...
<listener>
<listener-class>
org.apache.commons.fileupload.servlet.FileCleanerCleanup
</listener-class>
</listener>
...
</web-app>
FileCleanerCleanup 通過一個靜態方法getFileCleaningTracker()提供一個
org.apache.commons.io.FileCleaningTracker 對象。構造DiskFileItemFactory后,需要設置一個
FileCleaningTracker 對象,用于追蹤產生的臨時文件。如果不想追蹤臨時文件,設置
FileCleaningTracker 為null。
FileCleaningTracker fileCleaningTracker = FileCleanerCleanup.getFileCleaningTracker(servletcontext);
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setFileCleaningTracker(fileCleaningTracker);
事情到這里還沒完。如果你和下面的情況一樣,那么你就只需要按照上面的做,就可以清除資源了:
l 如果你使用的是 commons-io 1.3 或者更晚的版本。
l 你是從web 應用的 web-inf/lib里載入 commons-io 的,而不是從其它位置,如Tomcat 的common/lib
下載入 commons-io 的。
如果 commons-io是通過WEB 容器的 classpath載入的,那么,下面的情況可能會出現:
如果Tomcat中運行著兩個應用,一個叫A,一個叫 B。這兩個應用都使用了 FileCleanerCleanup 監聽器。
現在,如果你關閉應用A,而B 還在運行,這時,A 會終止 B 的收割機線程。換言之,你要十分仔細地考
慮是使用 FileCleanerCleanup,還是不使用。
鄭州蜂鳥科技有限公司 申林 QQ:38185398 鄭州軟件開發興趣小組群:38236716
學軟件開發,到蜂鳥科技!超強的師資力量 、完善的課程體系 、超低的培訓價格 、真實的企業項目。
地址:鄭州市文化路豐產路口東50米豐產路21號SOHO世紀城西塔20樓F
電話:0371-63839606 手機:13838505572(申老師) 13673990036 (許老師)
QQ: 1073422643 1群:47614738 2群:108157678
網址:www.ntcsoft.com
posted on 2010-09-03 23:56
whistler 閱讀(2595)
評論(0) 編輯 收藏