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 阅读(2583)
评论(0) 编辑 收藏