posts - 0,  comments - 6,  trackbacks - 0

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);

事情到这里还没完。如果你和下面的情况一样,那么你就只需要按照上面的做,就可以清除资源了: 

如果你使用的是 commons-io 1.3 或者更晚的版本。 

你是从web 应用的 web-inf/lib里载入 commons-io 的,而不是从其它位置,如Tomcat common/lib 
下载入 commons-io 的。 

如果 commons-io是通过WEB 容器的 classpath载入的,那么,下面的情况可能会出现:

如果Tomcat中运行着两个应用,一个叫A,一个叫 B。这两个应用都使用了 FileCleanerCleanup 监听器。
现在,如果你关闭应用
A,而还在运行,这时,会终止 的收割机线程。换言之,你要十分仔细地考
虑是使用 
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)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

留言簿(2)

我参与的团队

文章档案(22)

搜索

  •  

最新评论