文件监听的例子 JAVA版

xiaoxiao2024-04-18  28

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

 比如自动编译文件,自动重载文件啊,应该都是通过这个机制去实现的。下面贴点代码,附件也给出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里起一个主线程。

转载请注明原文地址: https://www.6miu.com/read-5015064.html

最新回复(0)