Mega Code Archive

 
Categories / Java / File Input Output
 

Monitor files for changes

// Copyright (C) 2007 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import java.io.File; import java.util.Hashtable; import java.util.Timer; import java.util.TimerTask; /**  * Monitor files for changes. This singleton class maintains a map of files to  * monitor and objects to notify when something they change.  */ public class FileMonitor {   private static final FileMonitor SINGLETON = new FileMonitor();   private Timer timer;   private Hashtable<String, TimerTask> timerTasks;   private FileMonitor() {     timer = new Timer(true);     timerTasks = new Hashtable<String, TimerTask>();   }   /**    * Returns the singleton instance of this class.    * @return the singleton instance    */   public static FileMonitor getInstance() {     return SINGLETON;   }   /**    * Start monitoring a file.    *     * @param listener listener to notify when the file changed.    * @param fileName name of the file to monitor.    * @param period polling period in milliseconds.    */   public void addFileChangeListener(FileChangeListener listener,       String fileName, long period) {     removeFileChangeListener(listener, fileName);     FileMonitorTask task = new FileMonitorTask(listener, fileName);     timerTasks.put(fileName + listener.hashCode(), task);     timer.schedule(task, period, period);   }   /**    * Remove the listener from the notification list.    *     * @param listener the listener to be removed.    */   public void removeFileChangeListener(FileChangeListener listener,       String fileName) {     FileMonitorTask task = (FileMonitorTask) timerTasks.remove(fileName         + listener.hashCode());     if (task != null) {       task.cancel();     }   }   protected void fireFileChangeEvent(FileChangeListener listener,       String fileName) {     listener.fileChanged(fileName);   }   class FileMonitorTask extends TimerTask {     FileChangeListener listener;     String fileName;     File monitoredFile;     long lastModified;     public FileMonitorTask(FileChangeListener listener, String fileName) {       this.listener = listener;       this.fileName = fileName;       this.lastModified = 0;       monitoredFile = new File(fileName);       this.lastModified = getLastModified();     }     private long getLastModified() {       if (monitoredFile.exists()) {          return monitoredFile.lastModified();       } else {         return -1;       }     }     @Override     public void run() {       long lastModified = getLastModified();       if (lastModified != this.lastModified) {         this.lastModified = lastModified;         fireFileChangeEvent(this.listener, this.fileName);       }     }   }      public interface FileChangeListener {     public void fileChanged(String fileName);   } }