一直使用tomcat开发,只要将<Context docBase="MyTest" path="/MyTest" reloadable="true" /></Host>中的reloadable属性设置成true.Tomcat就能自动监测到某个文件发生了改变,然后重新装载。由于对这个有点兴趣,所有也试着写了一个简单的实现,但对于文件夹下的多个文件监测,除了把每个文件都加入监测器中外,没有更好的思路和方法。大家可以讨论一下:

除件有我测试的整个eclipse工程文件,有兴趣的童鞋们可以看一下.

FileMonitor类的代码如下所示:

public class FileMonitor {private static final FileMonitor instance = new FileMonitor();private Timer timer;private Map<String, FileMonitorTask> timerEntries;private FileMonitor() {this.timerEntries = new HashMap<String, FileMonitorTask>();this.timer = new Timer();}public static FileMonitor getInstance() {return instance;}/*** 对某个文件实行监听* * @param listener*            The file listener* @param filename*            The filename to watch* @param period*            The watch interval.*/public void addFileChangeListener(FileChangeListener listener,String filename, long period) {this.removeFileChangeListener(filename);FileMonitorTask task = new FileMonitorTask(listener, filename);this.timerEntries.put(filename, task);this.timer.schedule(task, period, period);}/*** 停止对某个文件的监听* * @param listener*            The file listener* @param filename*            The filename to keep watch*/public void removeFileChangeListener(String filename) {FileMonitorTask task = (FileMonitorTask) this.timerEntries.remove(filename);if (task != null) {task.cancel();}}private static class FileMonitorTask extends TimerTask {private FileChangeListener listener;private String filename;private File monitoredFile;private long lastModified;public FileMonitorTask(FileChangeListener listener, String filename) {this.listener = listener;this.filename = filename;this.monitoredFile = new File(filename);if (!this.monitoredFile.exists()) {return;}this.lastModified = this.monitoredFile.lastModified();}public void run() {long latestChange = this.monitoredFile.lastModified();if (this.lastModified != latestChange) {this.lastModified = latestChange;//对发生改变的文件调用处理方法this.listener.fileChanged(this.filename);}}}
}

当监听到文件发生改变时处理的类如下所示:

public class ClassFileChangeListener implements FileChangeListener {/** 当被监听的文件发生改变时,调用此方法* */public void fileChanged(String filename) {System.out.println("File " + filename + " modified ,it must  reload  !");}
} 

当web容器启动时,将要监听的文件加入到文件监听器类中,servet类如下所示:

public class InitServlet extends HttpServlet {private static final long serialVersionUID = 1L;@Overridepublic void init(ServletConfig config) throws ServletException {// TODO Auto-generated method stubsuper.init(config);long period = Long.parseLong(config.getInitParameter("period"));String filename = config.getInitParameter("filename");if(period > 0 && filename != null && !filename.isEmpty()){//String realPath = config.getServletContext().getRealPath("");//String filename = realPath + "\\WEB-INF\\classes\\jdbc.propertis";FileMonitor.getInstance().addFileChangeListener(new ClassFileChangeListener(), filename, period);}}/*** @see HttpServlet#HttpServlet()*/public InitServlet() {super();// TODO Auto-generated constructor stub}
}

web.xml中的配置如下所示:

<servlet><description></description><display-name>InitServlet</display-name><servlet-name>InitServlet</servlet-name><servlet-class>servlet.InitServlet</servlet-class><init-param><!-- the period of watching file --><param-name>period</param-name><!--  milliseconds --><param-value>1000</param-value></init-param><init-param><param-name>filename</param-name><param-value>D:/aa.txt</param-value></init-param><load-on-startup>0</load-on-startup></servlet>

由于使用eclipse开发时,eclipse中的tomcat,将文件部署在了:D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp3\wtpwebapps

下面,如我的这个工程中的jdbc.properties文件部署成了D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp3\wtpwebapps\MyTest\WEB-INF\classes\jdbc.propertis,

此时使用此路径创建的File不存在,所以为了方便测试,我将要监听的文件路径作为InitServlet的一个初始化参数了。

除件是整个工程的文件,直接导入eclipse中即可使用。

分享一个文件监听器类:FileMonitor相关推荐

  1. 分享一个文件上传工具类

    文件上传状态枚举类: View Code 1 package com.hoo.enums; 2 3 4 5 /** 6 7 * <b>function:</b> 文件上传状态 ...

  2. Android官方开发文档Training系列课程中文版:分享文件之分享一个文件

    原文地址:http://android.xsoftlab.net/training/secure-file-sharing/share-file.html 一旦APP设置通过URI的方式共享文件,你需 ...

  3. 只是一个文件节点类为了项目的数据处理

    已经研究生二年级下学期了,已经为了这个检索项目写了差不多2年代码了,回想大四下学期就开始接触的这个项目,在研一的时候根本不知道科研如何做,而且项目就自己一个人,也是胡乱写了代码,而且心事太多,简直只能 ...

  4. 【python 3.6】调用另一个文件的类的方法

    文件1:test12.py 文件2:test13.py 文件1 如下: #!/usr/bin/python # -*- coding: utf-8 -*- '''''' class abcd(obje ...

  5. 文件操作工具类FileUtil

    分享一个文件处理的工具类,依赖如下: <dependency><groupId>org.apache.ant</groupId><artifactId> ...

  6. php缓存实例,一个PHP缓存类实例

    一个PHP缓存类实例 发布于 2014-08-05 21:44:28 | 104 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Preproce ...

  7. (vc)分享一个读写ini文件的类,支持多种数据类型的读写,二进制数据都能保存和读取...

    读写ini文件的类叫CIni,有ini.h和ini.cpp两个文件组成.     ini.h文件: #pragma once#define SER_GET(bGet,value) SerGet(bGe ...

  8. python modbus类封装_Python 中引入一个文件,模块的概念

    Python 提供了强大的模块支持,主要体现在,不仅 Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块. 通过这些强大的模块可以极大地提高开 ...

  9. 分享一个nodejs中koa操作redis的工具类 基于 ioredis

    分享一个node 操作redis的工具类 基于ioredis redis.js const config = require(':config/server.base.config'); const ...

最新文章

  1. Hbase(3)——desc、alter、时间戳
  2. 26_多线程_第26天(Thread、线程创建、线程池)_讲义
  3. 浅谈内存开辟问题和Block内存问题
  4. jQuery中map方法
  5. can总线配置读入是什么意思_CAN总线基础知识学习笔记
  6. 5555555,老粘不上来。。
  7. Python:货币转换(写一个程序进行人民币和美元货币之间的币值转换)
  8. android a2dp连接 广播接收器,android – 如何连接到蓝牙a2dp设备?
  9. 计算机电路基础知识点总结,《计算机电路基础》课程教学方法的探索
  10. 解决 Windows XP 桌面图标阴影的情况
  11. 单片机仿真指示灯开关控制器
  12. Wishbone总线快速了解
  13. 那些年的,那些人的,那些事。
  14. Xshell 常用配置
  15. BIOS实战之读写逻辑设备(SIO)
  16. SpringBoot+Es7.6.1+Jsoup+Vue+Docker打造古诗词实时搜索功能
  17. hdfs Trash回收站配置 java操作trash不生效解决
  18. 串口---UART RS232 RS485 TTL
  19. 【Java培训】 IT行业是什么
  20. 那些年,我们一起写的设计模式(一)——单例模式(Singleton Pattern)

热门文章

  1. html5 气泡文字提示框,css实现气泡文字提示框代码教程
  2. Linux下JNI调用简单实例操作全过程
  3. Java/JDK安装与环境配置教程
  4. Windows7下固态硬盘安装Linux Mint 18双系统
  5. flash 8组件篇:ScrollPane组件
  6. RxJava详解(基于2.X版本的功能操作符)
  7. 参数不匹配; <匿名OnClickListener>无法转换为Context
  8. P2058 [NOIP2016 普及组] 海港
  9. python什么是矢量化运算?
  10. 世界顶级杀毒软件排行(Toptennews)