主要实现的机制大体网上都有说明,就是一个线呈一直跑着,监听着文件的最后修改时间,然后再进行一些处理。
比如自动编译文件,自动重载文件啊,应该都是通过这个机制去实现的。下面贴点代码,附件也给出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里起一个主线程。
分享到:
相关推荐
java一个监听器的例子
NULL 博文链接:https://andilyliao.iteye.com/blog/634586
个人觉得用定时任务来跑垃圾回收不是很好的例子,从译者接触到的项目来看,比较常见的是用定时任务来进行非实时计算,清除临时数据、文件等。 在本文里,我会给大家介绍3种不同的实现方法,listener-class标签 --WEB...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程...
28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程...
打开Eclipse(可以到http://www.eclipse.org/现在官方最新版,Eclipse本身是免费软件),导入ch01下的java项目,然后保存、运行game.ErsBlocksGame类即可。 Ch02:俄罗斯方块双人对战的实现 安装JDK,并配置环境...
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游戏编程 原名: Java 2 Game Programming ...附录D 使用.JAR文件来部署Java applet 附录E 正确运行Java 2 applet 附录F Magic游戏引擎源码清单 附录G 更多的资源 附录H 配书光盘中有些什么
学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...
本项目是MyEclipse项目,其中的"src"目录是源代码,"bin"目录是class文件 使用方法: 在命令提示符下输入(命令提示符要切换到bin目录,9999是指端口,不输则为80): java RunWebServer 9999 程序启动后会出现...
有两个回调函数:obj.DropFileFcn 和 obj.DropStringFcn,分别监听系统文件或纯文本的删除操作。 拖放控件类依赖于需要在 Java 类路径上可见的 Java 类“MLDropTarget.class”。 要进行初始化,请调用静态方法 ...