多線程 監聽文件改動

一種比較簡陋的方法:

 1  ActionListener taskPerformer  =   new  ActionListener() {
 2               public   void  actionPerformed(ActionEvent evt) {
 3                  log.info( " monitor is running at  "   +   new  java.util.Date());
 4                  String configfile  =  (String)getServletContext().getAttribute( " configfile " );
 5                   if (configfile  !=   null   &&  configfile.length() != 0 ){
 6                       try {
 7                          File file  =   new  File(configfile);
 8                           if (file.lastModified()  >  lastModifyTime){
 9                              lastModifyTime  =  file.lastModified();
10                              loadProp();
11                          }
12                      } catch (Exception e){
13                          log.error( " construct file: "   +  configfile  +   "  exception " );
14                          e.printStackTrace();
15                      }
16                  }
17              }
18   };
19          
20   // 啓動監聽線程
21  new  Timer(delay, taskPerformer).start();


來自geosoft.no的解決方法:
 1  import  java.io.File;
 2  
 3  /**
 4   * Interface for listening to disk file changes.
 5   *  @see  FileMonitor
 6   * 
 7   *  @author  <a href="mailto:[email protected]">Jacob Dreyer</a>
 8    */    
 9  public   interface  FileListener
10  {
11     /**
12     * Called when one of the monitored files are created, deleted
13     * or modified.
14     * 
15     *  @param  file  File which has been changed.
16      */
17     void  fileChanged (File file);
18  }

  1  import  java.util. * ;
  2  import  java.io.File;
  3  import  java.lang.ref.WeakReference;
  4  
  5  /**
  6   * Class for monitoring changes in disk files.
  7   * Usage:
  8   *
  9   *    1. Implement the FileListener interface.
 10   *    2. Create a FileMonitor instance.
 11   *    3. Add the file(s)/directory(ies) to listen for.
 12   *
 13   * fileChanged() will be called when a monitored file is created,
 14   * deleted or its modified time changes.
 15   *
 16   *  @author  <a href="mailto:[email protected]">Jacob Dreyer</a>
 17    */    
 18  public   class  FileMonitor
 19  {
 20     private  Timer       timer_;
 21     private  HashMap     files_;        //  File -> Long
 22     private  Collection  listeners_;    //  of WeakReference(FileListener)
 23     
 24  
 25     /**
 26     * Create a file monitor instance with specified polling interval.
 27     * 
 28     *  @param  pollingInterval  Polling interval in milli seconds.
 29      */
 30     public  FileMonitor ( long  pollingInterval)
 31    {
 32      files_      =   new  HashMap();
 33      listeners_  =   new  ArrayList();
 34  
 35      timer_  =   new  Timer ( true );
 36      timer_.schedule ( new  FileMonitorNotifier(),  0 , pollingInterval);
 37    }
 38  
 39  
 40    
 41     /**
 42     * Stop the file monitor polling.
 43      */
 44     public   void  stop()
 45    {
 46      timer_.cancel();
 47    }
 48    
 49  
 50     /**
 51     * Add file to listen for. File may be any java.io.File (including a
 52     * directory) and may well be a non-existing file in the case where the
 53     * creating of the file is to be trepped.
 54     * <p>
 55     * More than one file can be listened for. When the specified file is
 56     * created, modified or deleted, listeners are notified.
 57     * 
 58     *  @param  file  File to listen for.
 59      */
 60     public   void  addFile (File file)
 61    {
 62       if  ( ! files_.containsKey (file)) {
 63         long  modifiedTime  =  file.exists()  ?  file.lastModified() :  - 1 ;
 64        files_.put (file,  new  Long (modifiedTime));
 65      }
 66    }
 67  
 68    
 69  
 70     /**
 71     * Remove specified file for listening.
 72     * 
 73     *  @param  file  File to remove.
 74      */
 75     public   void  removeFile (File file)
 76    {
 77      files_.remove (file);
 78    }
 79  
 80  
 81    
 82     /**
 83     * Add listener to this file monitor.
 84     * 
 85     *  @param  fileListener  Listener to add.
 86      */
 87     public   void  addListener (FileListener fileListener)
 88    {
 89       //  Don't add if its already there
 90       for  (Iterator i  =  listeners_.iterator(); i.hasNext(); ) {
 91        WeakReference reference  =  (WeakReference) i.next();
 92        FileListener listener  =  (FileListener) reference.get();
 93         if  (listener  ==  fileListener)
 94           return ;
 95      }
 96  
 97       //  Use WeakReference to avoid memory leak if this becomes the
 98       //  sole reference to the object.
 99      listeners_.add ( new  WeakReference (fileListener));
100    }
101  
102  
103    
104     /**
105     * Remove listener from this file monitor.
106     * 
107     *  @param  fileListener  Listener to remove.
108      */
109     public   void  removeListener (FileListener fileListener)
110    {
111       for  (Iterator i  =  listeners_.iterator(); i.hasNext(); ) {
112        WeakReference reference  =  (WeakReference) i.next();
113        FileListener listener  =  (FileListener) reference.get();
114         if  (listener  ==  fileListener) {
115          i.remove();
116           break ;
117        }
118      }
119    }
120  
121  
122    
123     /**
124     * This is the timer thread which is executed every n milliseconds
125     * according to the setting of the file monitor. It investigates the
126     * file in question and notify listeners if changed.
127      */
128     private   class  FileMonitorNotifier  extends  TimerTask
129    {
130       public   void  run()
131      {
132         //  Loop over the registered files and see which have changed.
133         //  Use a copy of the list in case listener wants to alter the
134         //  list within its fileChanged method.
135        Collection files  =   new  ArrayList (files_.keySet());
136        
137         for  (Iterator i  =  files.iterator(); i.hasNext(); ) {
138          File file  =  (File) i.next();
139           long  lastModifiedTime  =  ((Long) files_.get (file)).longValue();
140           long  newModifiedTime   =  file.exists()  ?  file.lastModified() :  - 1 ;
141  
142           //  Chek if file has changed
143           if  (newModifiedTime  !=  lastModifiedTime) {
144  
145             //  Register new modified time
146            files_.put (file,  new  Long (newModifiedTime));
147  
148             //  Notify listeners
149             for  (Iterator j  =  listeners_.iterator(); j.hasNext(); ) {
150              WeakReference reference  =  (WeakReference) j.next();
151              FileListener listener  =  (FileListener) reference.get();
152  
153               //  Remove from list if the back-end object has been GC'd
154               if  (listener  ==   null )
155                j.remove();
156               else
157                listener.fileChanged (file);
158            }
159          }
160        }
161      }
162    }
163  
164  
165     /**
166     * Test this class.
167     * 
168     *  @param  args  Not used.
169      */
170     public   static   void  main (String args[])
171    {
172       //  Create the monitor
173      FileMonitor monitor  =   new  FileMonitor ( 1000 );
174  
175       //  Add some files to listen for
176      monitor.addFile ( new  File ( " D://myjava//JCreatorWorkspace//FileMonitor//test.txt " ));
177  
178       //  Add a dummy listener
179      monitor.addListener (monitor. new  TestListener());
180  
181       //  Avoid program exit
182       while  ( ! false ) ;
183    }
184  
185    
186     private   class  TestListener
187       implements  FileListener
188    {
189       public   void  fileChanged (File file)
190      {
191        System.out.println ( " File [ "   +  file.getName()  +   " ] changed At: "   +   new  java.util.Date());
192      }
193    }
194  }
195  
196  
197  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章