主要实现的机制大体网上都有说明,就是一个线呈一直跑着,监听着文件的最后修改时间,然后再进行一些处理。
比如自动编译文件,自动重载文件啊,应该都是通过这个机制去实现的。下面贴点代码,附件也给出eclipse代码工程.
代理是参考别人的改的,还挺简单的,我就是整理了一下,谁需要就直接拿去用吧。
1 FileListener.java 监听接口
- import java.io.File;
- public interface FileListener
- {
- void fileChanged (File file);
- }
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());
- }
- }
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);
- }
- }
- }
- }
- }
- }
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 )
- ;
- }
- }
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里起一个主线程。