分享一个文件监听器类:FileMonitor
一直使用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相关推荐
- 分享一个文件上传工具类
文件上传状态枚举类: View Code 1 package com.hoo.enums; 2 3 4 5 /** 6 7 * <b>function:</b> 文件上传状态 ...
- Android官方开发文档Training系列课程中文版:分享文件之分享一个文件
原文地址:http://android.xsoftlab.net/training/secure-file-sharing/share-file.html 一旦APP设置通过URI的方式共享文件,你需 ...
- 只是一个文件节点类为了项目的数据处理
已经研究生二年级下学期了,已经为了这个检索项目写了差不多2年代码了,回想大四下学期就开始接触的这个项目,在研一的时候根本不知道科研如何做,而且项目就自己一个人,也是胡乱写了代码,而且心事太多,简直只能 ...
- 【python 3.6】调用另一个文件的类的方法
文件1:test12.py 文件2:test13.py 文件1 如下: #!/usr/bin/python # -*- coding: utf-8 -*- '''''' class abcd(obje ...
- 文件操作工具类FileUtil
分享一个文件处理的工具类,依赖如下: <dependency><groupId>org.apache.ant</groupId><artifactId> ...
- php缓存实例,一个PHP缓存类实例
一个PHP缓存类实例 发布于 2014-08-05 21:44:28 | 104 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Preproce ...
- (vc)分享一个读写ini文件的类,支持多种数据类型的读写,二进制数据都能保存和读取...
读写ini文件的类叫CIni,有ini.h和ini.cpp两个文件组成. ini.h文件: #pragma once#define SER_GET(bGet,value) SerGet(bGe ...
- python modbus类封装_Python 中引入一个文件,模块的概念
Python 提供了强大的模块支持,主要体现在,不仅 Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块. 通过这些强大的模块可以极大地提高开 ...
- 分享一个nodejs中koa操作redis的工具类 基于 ioredis
分享一个node 操作redis的工具类 基于ioredis redis.js const config = require(':config/server.base.config'); const ...
最新文章
- Hbase(3)——desc、alter、时间戳
- 26_多线程_第26天(Thread、线程创建、线程池)_讲义
- 浅谈内存开辟问题和Block内存问题
- jQuery中map方法
- can总线配置读入是什么意思_CAN总线基础知识学习笔记
- 5555555,老粘不上来。。
- Python:货币转换(写一个程序进行人民币和美元货币之间的币值转换)
- android a2dp连接 广播接收器,android – 如何连接到蓝牙a2dp设备?
- 计算机电路基础知识点总结,《计算机电路基础》课程教学方法的探索
- 解决 Windows XP 桌面图标阴影的情况
- 单片机仿真指示灯开关控制器
- Wishbone总线快速了解
- 那些年的,那些人的,那些事。
- Xshell 常用配置
- BIOS实战之读写逻辑设备(SIO)
- SpringBoot+Es7.6.1+Jsoup+Vue+Docker打造古诗词实时搜索功能
- hdfs Trash回收站配置 java操作trash不生效解决
- 串口---UART RS232 RS485 TTL
- 【Java培训】 IT行业是什么
- 那些年,我们一起写的设计模式(一)——单例模式(Singleton Pattern)