public class FileMonitor {
private static final Logger logger = Logger.getLogger(FileMonitor.class);
private static FileMonitor instance = null;
private Timer timer;
private Map<String, TimerTask> timerEntries;
public FileMonitor() {
timer = new Timer(true);
timerEntries = new HashMap<String, TimerTask>();
}
public static FileMonitor getInstance() {
if (instance == null) {
instance = new FileMonitor();
}
return instance;
}
public void cancel()
{
try {
if (timer != null) {
timer.cancel();
}
} catch(Exception e) {
e.printStackTrace();
}
}
public void addFileChangeListener(FileChangeListener listener,
String filename, long period) {
logger.info("开始进行监听文件名[" + filename + "]");
this.removeFileChangeListener(filename);
FileMonitorTask task = new FileMonitorTask(listener, filename);
this.timerEntries.put(filename, task);
this.timer.schedule(task, period, period);
}
public void removeFileChangeListener(String filename) {
FileMonitorTask task = (FileMonitorTask) timerEntries.get(filename);
if (task != null) {
task.cancel();
}
}
private static class FileMonitorTask extends TimerTask {
private FileChangeListener listener;
private String filename;
private File monitorFile;
private long lastModified;
public FileMonitorTask(FileChangeListener listener, String filename) {
this.listener = listener;
this.filename = filename;
this.monitorFile = new File(filename);
if (!this.monitorFile.exists()) {
return;
}
this.lastModified = this.monitorFile.lastModified();
}
@Override
public void run() {
long latestChange = this.monitorFile.lastModified();
if (latestChange != this.lastModified) {
this.lastModified = latestChange;
this.listener.fileChanged(this.filename);
}
}
}