`

分享一个文件监听器类:FileMonitor

    博客分类:
  • Java
阅读更多

   一直使用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;
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		super.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中即可使用。

分享到:
评论
12 楼 knight_black_bob 2016-03-02  
楼主 ,怎么监听 远程 文件夹 ?
11 楼 小勇12 2011-06-22  
不晓得是否底层又是用JNI来完成的
10 楼 qiuboboy 2011-06-21  
你去找找有个java的开源实现,可以监控文件系统的。
9 楼 liyun_1981 2011-06-21  
支持楼主一个,觉得可在fileChanged方法里面加入自定义运行时类加载的逻辑,这样就比较有实用价值了。
PS:楼上几个都没说到点子上。。。
8 楼 cs624178950 2011-06-20  
呵呵!还是不错,,
7 楼 chenchuan 2011-06-20  
好像java7里面已经加上了这个功能了 具体的没有用过 模糊的记得Java7新特性监听文件改变
http://blog.csdn.net/jastar/archive/2011/03/18/6259500.aspx
6 楼 ryxxlong 2011-06-19  
gzfreeman 写道
好像apache的commons-io库就有可提供FileMonitor的功能阿



谢谢,commons-io库确实有FileMonitor的功能

Commons IO is a library of utilities to assist with developing IO functionality.
There are six main areas included:
Utility classes - with static methods to perform common tasks
Input - useful Input Stream and Reader implementations
Output - useful Output Stream and Writer implementations
Filters - various implementations of file filters
Comparators - various implementations of java.util.Comparator for files
File Monitor - a component for monitoring file system events
5 楼 甄子丹 2011-06-19  
apache vfs可以监听文件变化
4 楼 gzfreeman 2011-06-19  
好像apache的commons-io库就有可提供FileMonitor的功能阿
3 楼 ryxxlong 2011-06-17  
kimmking 写道
1\lastmodified不准
2\1000ms太长了
3\Timer太浪费了

还是等jdk支持操作系统级的fileWatch吧~(jdk7)




呵呵,我现在的水平只能想到这,谢谢你的建议
2 楼 kimmking 2011-06-17  
1\lastmodified不准
2\1000ms太长了
3\Timer太浪费了

还是等jdk支持操作系统级的fileWatch吧~(jdk7)
1 楼 ryxxlong 2011-06-17  
竟然没一个人有兴趣,真是杯具

相关推荐

    java一个监听器的例子

    java一个监听器的例子

    android 外部类作为事件监听器类

    android 外部类作为事件监听器类 ,外部类形式的事件监听器不能自由访问创建GUI界面

    JAVA文件监控(源码)

    // 创建一个文件监察器用于处理文件的格式 FileAlterationObserver observer = new FileAlterationObserver(rootDir,fileFilter,null); //设置文件变化监听器 observer.addListener(new FileMonitor()); //创建文件...

    自己编写一个Java监听器

    1.原理:  当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。...  2.2当事件源上发生操作时,它会调用事件监听器的一个方法,并且调用这个方法时,会传递事件对象过来  2.3事件监听器是由开

    自定义事件的监听器

    2. 对某个源注册一个监听器,此源便成为一个事件源,当事件源上发生某一个动作时,监听器的某个方法将会被调用执行,在执行事件监听器的这个方法时,同时会把事件监听对象传递给此方法,开发人员在监听器中可以拿到...

    Java文件操作一例:Copy 复制文件.rar

    Java文件操作一例:Copy 复制文件,虽然是复制文件,不过通过本源码你可以学习很多相关的Java基础技巧,比如Java对文件的事件处理、取得目录内容的事件处理、如何弹出文件选择器、如何得到选择文件的绝对路径、如何...

    监听器:监听三个对象的创建和销毁方法

    本次工程的目标是学习监听器,掌握监听三个对象的创建和销毁方法。 三个对象:rquest,session,...1.自定义实现三个监听器的类 2.使用注解的方法注册监听器 3.部署工程并运行,在控制台会输出相应的信息

    匿名内部类作为事件监听器

    定义一个按钮bn,并通过创建匿名内部类实现事件监听bn是否被按下。

    java android 文件监听器

    对一个文件夹进行实时监控,当文件夹有新的文件出现时,对其做相应的操作

    java事件监听器

    当你将一个类用作事件监听器时,你已经设置好一个特定的事件类型,它会用该类进行监听。接下来的操作是:一个匹配的监听器必须被加入到该组件中 组件被创建之后,可以在组件上调用如下方法来将监听器与它联系起来 ...

    JavaWeb开发技术-Listener监听器.pptx

    Listener监听器 JavaBean Servlet Jsp XML HTML JAVA WEB开发技术 Listener监听器 事件监听器用于对程序中发生的事件进行监听,在监听的过程中会涉及几个重要组成部分: 事件(Event) 事件源 事件处理器 事件监听器...

    STRUTS:listener监听器

    STRUTS:listener监听器

    Process Monitor中文手册.CHM

    比如,如果用户A把挂载的一个共享作为Z:盘符,则在Process Monitor中,所有对这个共享的操作都会被显示为相对于驱动器Z:。想在列表中清除文件系统的操作,在Process Monitor工具栏上反选“文件系统”按钮,再次按下...

    servlet中的过滤器与监听器

    NULL 博文链接:https://hngmduyi.iteye.com/blog/581150

    监听目录 coffee文件变化 vbs实现

    coffee虽然自带监听文件变化自动编译成js,但一次开一个窗口只能监听一个文件。于是自己写了个vbs脚本,监听某目录下所有coffee文件,如有变化自动编译。 原理是无限循环扫描目录,比对coffee文件MD5值是否变化,...

    Android软键盘打开/关闭监听器

    在开发时遇到一个问题,需要对软...但是由于android不直接提供对软键盘打开与关闭操作的监听器,所以必须自己来写一个关于软键盘打开/关闭的监听器。 原理是通过对OnGlobalLayoutListener()来实现对软键盘的状态监听器

    Linux指令一周通 (技术图书大系).azw3

    4.36 uucp 指令:将特定文件复制到另一个特定系统 4.37 uulog指令:显示uucp记录信息 4.38 uuname指令:显示uucp远端主机 4.39 uustat指令:显示uucp状态 4.40 uux指令:在远端的uucp主机上运行指令 4.41 wall指令:...

    txt文件阅读器

    filter:该包中放的MyFileFilter.java是一个文件过滤器,只过滤我们需要的txt文本文件 read:该包中的Read_book.java和File_content.java Read_book 主体类,负责界面设计,以及一些基本的监听事件的处理 File_...

    三种简单的监听器电路图分享

    下图所示的驻波比监听器电路是专门为盲人业余无线电爱好者设计的,其目的是让盲人能够根据声音来检查传输线的驻波比,并尽可能把源阻抗与负载阻抗调整到完全匹配。图中的黑粗线是两条6*70mm的薄金属条彼此相距1.5mm...

    nodejs-book-samples:Node.js示例。 (Node.js案例大全)《 Node.js企业级应用开发实战》

    :第一个Node.js应用 :deepStrictEqual示例 :指定编码 :切分长度 :连接 :比较长度 :解码 :编码 :监听事件 :lambda方式监听事件 :异步模式监听事件 :仅处理事件一次 :为错误事件注册监听器 ...

Global site tag (gtag.js) - Google Analytics