`
jy02149522
  • 浏览: 46805 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

文件监听的例子 JAVA版

    博客分类:
  • JAVA
阅读更多

 主要实现的机制大体网上都有说明,就是一个线呈一直跑着,监听着文件的最后修改时间,然后再进行一些处理。

 比如自动编译文件,自动重载文件啊,应该都是通过这个机制去实现的。下面贴点代码,附件也给出eclipse代码工程.

代理是参考别人的改的,还挺简单的,我就是整理了一下,谁需要就直接拿去用吧。

 

1 FileListener.java  监听接口

 

import java.io.File;

public interface FileListener
{
	void fileChanged (File file);
} 

 2 FileListenerImpl.java 具体的监听实现

import java.io.File;


public class FileListenerImpl implements FileListener {

	public void fileChanged(File file) {
		System.out.println(" File [ " + file.getName() + " ] changed At: "
				+ new java.util.Date());
	}
}

 3 FileMonitor.java 监听任务的工作类

import java.util.*;
import java.io.File;
import java.lang.ref.WeakReference;

public class FileMonitor {

	private Timer timer;

	private HashMap files_; 

	private Collection listeners; // of WeakReference(FileListener)

	public FileMonitor(long pollingInterval) {
		files_ = new HashMap();
		listeners = new ArrayList();
		timer = new Timer(true);
		timer.schedule(new FileMonitorNotifier(), 0, pollingInterval);
	}

	public void stop() {
		timer.cancel();
	}

	public void addFile(File file) {
		if (!files_.containsKey(file)) {
			long modifiedTime = file.exists() ? file.lastModified() : -1;
			files_.put(file, new Long(modifiedTime));
		}
	}

	public void removeFile(File file) {
		files_.remove(file);
	}

	public void addListener(FileListener fileListener) {
		for (Iterator i = listeners.iterator(); i.hasNext();) {
			WeakReference reference = (WeakReference) i.next();
			FileListener listener = (FileListener) reference.get();
			if (listener == fileListener)
				return;
		}
		listeners.add(new WeakReference(fileListener));
	}

	public void removeListener(FileListener fileListener) {
		for (Iterator i = listeners.iterator(); i.hasNext();) {
			WeakReference reference = (WeakReference) i.next();
			FileListener listener = (FileListener) reference.get();
			if (listener == fileListener) {
				i.remove();
				break;
			}
		}
	}

	private class FileMonitorNotifier extends TimerTask {
		public void run() {
			Collection files = new ArrayList(files_.keySet());

			for (Iterator i = files.iterator(); i.hasNext();) {
				File file = (File) i.next();
				long lastModifiedTime = ((Long) files_.get(file)).longValue();
				long newModifiedTime = file.exists() ? file.lastModified() : -1;

				if (newModifiedTime != lastModifiedTime) {

					files_.put(file, new Long(newModifiedTime));

					for (Iterator j = listeners.iterator(); j.hasNext();) {
						WeakReference reference = (WeakReference) j.next();
						FileListener listener = (FileListener) reference.get();

						// Remove from list if the back-end object has been GC'd
						if (listener == null)
							j.remove();
						else
							listener.fileChanged(file);
					}
				}
			}
		}
	}


}

对上段代码有两个地方不太理解 有高手请帮我解答一下

第一点:为什么要使用WeakReference 呢?这个是干什么用的,我查了下是若引用,但还是不明白,在这里为什么要用这个呢。

 第二点:private HashMap files_; 对于files_的声明,为什么我把files_的下划线用eclipse重构功能去掉(也就是改  名)后,底下就会报错呢。

4 Test.java 测试类

import java.io.File;


public class Test {
	public static void main(String args[]) {

		FileMonitor monitor = new FileMonitor(1000);

		monitor.addFile(new File(
				"C:\\wlrun.log"));
		monitor.addListener(new FileListenerImpl());

		while (!false)
		;
	}
}

 其中FileMonitor monitor = new FileMonitor(1000)中的参数1000 是间隔多长时间进行检查一次,大家在使用的时候

通常是做一个专门处理该任务的线程,而不是直接在main里起一个主线程。

分享到:
评论
3 楼 hcwj2009 2011-09-15  
也就是重名了....
2 楼 hcwj2009 2011-09-15  
关于第二个问题,在内部类
private class FileMonitorNotifier extends TimerTask 
中,有这么一声明“
Collection files = new ArrayList(files_.keySet());   
”,楼主一定没有注意,恰巧在这里有用到了
 long lastModifiedTime = ((Long)[color=red] files_.[/color]get(file)).longValue();   
,当然会报错了
1 楼 310628570 2009-06-15  
不错!!  

相关推荐

    java一个监听器的例子

    java一个监听器的例子

    java文件监控例子--jnotify

    NULL 博文链接:https://andilyliao.iteye.com/blog/634586

    java后台监听代码,复制可用

    个人觉得用定时任务来跑垃圾回收不是很好的例子,从译者接触到的项目来看,比较常见的是用定时任务来进行非实时计算,清除临时数据、文件等。 在本文里,我会给大家介绍3种不同的实现方法,listener-class标签 --WEB...

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包4

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包3

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包2

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程...

    Java项目开发与毕业设计指导

    打开Eclipse(可以到http://www.eclipse.org/现在官方最新版,Eclipse本身是免费软件),导入ch01下的java项目,然后保存、运行game.ErsBlocksGame类即可。 Ch02:俄罗斯方块双人对战的实现 安装JDK,并配置环境...

    Java核心技术II(第8版)

    10.8 一个完整的例子 第六章 高级Swing 6.1 列表 6.1.1 JList构件 6.1.2 列表模式 6.1.3 插入和移除值 6.1.4 值的绘制 6.2 表格 6.2.1 简单表格 6.2.2 表格模型 6.2.3对行和列的操作 6.3 树 6.3.1 简单的树 6.3.2 ...

    Java2游戏编程.pdf

    中文名: Java2游戏编程 原名: Java 2 Game Programming ...附录D 使用.JAR文件来部署Java applet 附录E 正确运行Java 2 applet 附录F Magic游戏引擎源码清单 附录G 更多的资源 附录H 配书光盘中有些什么

    疯狂JAVA讲义

    学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...

    Java编写Web服务器,附有源码

    本项目是MyEclipse项目,其中的"src"目录是源代码,"bin"目录是class文件 使用方法: 在命令提示符下输入(命令提示符要切换到bin目录,9999是指端口,不输则为80): java RunWebServer 9999 程序启动后会出现...

    JAVA GUI 组件的拖放功能:拖放功能类-matlab开发

    有两个回调函数:obj.DropFileFcn 和 obj.DropStringFcn,分别监听系统文件或纯文本的删除操作。 拖放控件类依赖于需要在 Java 类路径上可见的 Java 类“MLDropTarget.class”。 要进行初始化,请调用静态方法 ...

Global site tag (gtag.js) - Google Analytics