java 监听线程_Java 多线程 监听文件改动,

这是一个用于监控硬盘文件变化的Java类。通过实现FileListener接口并创建FileMonitor实例,可以监听文件或目录的创建、删除和修改。定时器每隔一定时间检查文件状态,并在文件发生改变时调用fileChanged()方法通知监听器。
摘要由CSDN通过智能技术生成

1 importjava.util.*;2 importjava.io.File;3 importjava.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 *@authorJacob Dreyer17 */18 publicclassFileMonitor19 {20 privateTimer       timer_;21 privateHashMap     files_;//File -> Long22 privateCollection  listeners_;//of WeakReference(FileListener)23 24 25 /**26 * Create a file monitor instance with specified polling interval.27 *28 *@parampollingInterval  Polling interval in milli seconds.29 */30 publicFileMonitor (longpollingInterval)31 {32 files_=newHashMap();33 listeners_=newArrayList();34 35 timer_=newTimer (true);36 timer_.schedule (newFileMonitorNotifier(),0, pollingInterval);37 }38 39 40 41 /**42 * Stop the file monitor polling.43 */44 publicvoidstop()45 {46 timer_.cancel();47 }48 49 50 /**51 * Add file to listen for. File may be any java.io.File (including a52 * directory) and may well be a non-existing file in the case where the53 * creating of the file is to be trepped.54 * 

55 * More than one file can be listened for. When the specified file is56 * created, modified or deleted, listeners are notified.57 *58 *@paramfile  File to listen for.59 */60 publicvoidaddFile (File file)61 {62 if(!files_.containsKey (file)) {63 longmodifiedTime=file.exists()?file.lastModified() :-1;64 files_.put (file,newLong (modifiedTime));65 }66 }67 68 69 70 /**71 * Remove specified file for listening.72 *73 *@paramfile  File to remove.74 */75 publicvoidremoveFile (File file)76 {77 files_.remove (file);78 }79 80 81 82 /**83 * Add listener to this file monitor.84 *85 *@paramfileListener  Listener to add.86 */87 publicvoidaddListener (FileListener fileListener)88 {89 //Don't add if its already there90 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 the98 //sole reference to the object.99 listeners_.add (newWeakReference (fileListener));100 }101 102 103 104 /**105 * Remove listener from this file monitor.106 *107 *@paramfileListener  Listener to remove.108 */109 publicvoidremoveListener (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 milliseconds125 * according to the setting of the file monitor. It investigates the126 * file in question and notify listeners if changed.127 */128 privateclassFileMonitorNotifierextendsTimerTask129 {130 publicvoidrun()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 the134 //list within its fileChanged method.135 Collection files=newArrayList (files_.keySet());136 137 for(Iterator i=files.iterator(); i.hasNext(); ) {138 File file=(File) i.next();139 longlastModifiedTime=((Long) files_.get (file)).longValue();140 longnewModifiedTime=file.exists()?file.lastModified() :-1;141 142 //Chek if file has changed143 if(newModifiedTime!=lastModifiedTime) {144 145 //Register new modified time146 files_.put (file,newLong (newModifiedTime));147 148 //Notify listeners149 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'd154 if(listener==null)155 j.remove();156 else157 listener.fileChanged (file);158 }159 }160 }161 }162 }163 164 165 /**166 * Test this class.167 *168 *@paramargs  Not used.169 */170 publicstaticvoidmain (String args[])171 {172 //Create the monitor173 FileMonitor monitor=newFileMonitor (1000);174 175 //Add some files to listen for176 monitor.addFile (newFile ("D:\\myjava\\JCreatorWorkspace\\FileMonitor\\test.txt"));177 178 //Add a dummy listener179 monitor.addListener (monitor.newTestListener());180 181 //Avoid program exit182 while(!false) ;183 }184 185 186 privateclassTestListener187 implementsFileListener188 {189 publicvoidfileChanged (File file)190 {191 System.out.println ("File ["+file.getName()+"] changed At:"+newjava.util.Date());192 }193 }194 }195 196 197

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值