Java实现文件监控器FileMonitor的实例代码
应用场景:
代码可以实现文件变化后的监听,如文件变化,自动重新加载文件内容,实现配置文件的热部署。
代码:
packagecom.yx.demo.filemonitor; importjava.io.File; importjava.lang.ref.WeakReference; importjava.util.ArrayList; importjava.util.Collection; importjava.util.HashMap; importjava.util.Iterator; importjava.util.List; importjava.util.Timer; importjava.util.TimerTask; /** *FileMonitor *文件监控器 * *@authoryx *@date2019/12/210:59 */ publicclassFileMonitor{ /** *每2秒更新的默认监控器 */ privatestaticFileMonitordefaultFileMonitor=newFileMonitor(2*1000); privateTimertimer_; privateHashMapfiles_;//File->Long privateList fileEntrys=newjava.util.concurrent.CopyOnWriteArrayList (); privateCollection >listeners_;//ofWeakReference(FileListener) privatelongpollingInterval=10000; publicstaticFileMonitorgetDefaultFileMonitor(){ returndefaultFileMonitor; } /** *Createafilemonitorinstancewithspecifiedpollinginterval. * *@parampollingIntervalPollingintervalinmilliseconds. */ publicFileMonitor(longpollingInterval){ this.pollingInterval=pollingInterval; files_=newHashMap (); listeners_=newArrayList >(); timer_=newTimer("FileMonitor",true); timer_.schedule(newFileMonitorNotifier(),0,pollingInterval); } /** *Stopthefilemonitorpolling. */ publicvoidstop(){ timer_.cancel(); timer_=null; } publicvoidstart(){ if(timer_==null){ timer_=newTimer(true); timer_.schedule(newFileMonitorNotifier(),0,pollingInterval); } } /** *Addfiletolistenfor.Filemaybeanyjava.io.File(includinga *directory)andmaywellbeanon-existingfileinthecasewherethe *creatingofthefileistobetrepped. * *Morethanonefilecanbelistenedfor.Whenthespecifiedfileis *created,modifiedordeleted,listenersarenotified. * *@paramfileFiletolistenfor. */ publicvoidaddFile(Stringid,Filefile){ if(!files_.containsKey(file)){ FileEntryentry=newFileEntry(id,file,file.exists()?file.lastModified():-1); files_.put(file,entry); } } /** *添加监控文件实体。 * *@paramfileEntry */ publicvoidaddFileEntry(FileEntryfileEntry){ if(!fileEntrys.contains(fileEntry)){ fileEntrys.add(fileEntry); } } /** *通过文件实体的标识判断监控文件实体是否存在。 * *@paramid *@return */ publicbooleanfileEntryExists(Stringid){ if(id==null){ returnfalse; } for(inti=0;i
>i=listeners_.iterator();i.hasNext();){ WeakReference reference=i.next(); FileListenerlistener=(FileListener)reference.get(); if(listener==fileListener){ return; } } //UseWeakReferencetoavoidmemoryleakifthisbecomesthe //solereferencetotheobject. listeners_.add(newWeakReference (fileListener)); } /** *Removelistenerfromthisfilemonitor. * *@paramfileListenerListenertoremove. */ publicvoidremoveListener(FileListenerfileListener){ for(Iterator >i=listeners_.iterator();i.hasNext();){ WeakReference reference=(WeakReference )i.next(); FileListenerlistener=(FileListener)reference.get(); if(listener==fileListener){ i.remove(); break; } } } /** *Thisisthetimerthreadwhichisexecutedeverynmillisecondsaccording *tothesettingofthefilemonitor.Itinvestigatesthefileinquestion *andnotifylistenersifchanged. */ privateclassFileMonitorNotifierextendsTimerTask{ @Override publicvoidrun(){ try{ for(Iterator i=fileEntrys.iterator();i.hasNext();){ try{ FileEntryentry=i.next(); if(entry==null||!entry.check()){ i.remove(); } }catch(Throwablet){ t.printStackTrace(); System.out.println("执行文件监控发生错误:"+t.getMessage()); } } //Loopovertheregisteredfilesandseewhichhavechanged. //Useacopyofthelistincaselistenerwantstoalterthe //listwithinitsfileChangedmethod. Collection files=newArrayList (files_.keySet()); for(Iterator i=files.iterator();i.hasNext();){ Filefile=i.next(); try{ FileEntryfileEntry=files_.get(file); longlastModifiedTime=fileEntry.getLastModified(); longnewModifiedTime=file.exists()?file.lastModified():-1; //logger.debug(file.getAbsolutePath()); //logger.debug("{}=>{}",lastModifiedTime,newModifiedTime); //Chekiffilehaschanged if(newModifiedTime!=lastModifiedTime){ //logger.debug("filechanged{})",file.getAbsolutePath()); fileEntry.setLastModified(newModifiedTime); //Registernewmodifiedtime files_.put(file,fileEntry); if(fileEntry.getFileListener()!=null){ fileEntry.getFileListener().fileChanged(fileEntry); }else{ //Notifylisteners for(Iterator >j= listeners_.iterator();j.hasNext();){ WeakReference reference= (WeakReference )j.next(); FileListenerlistener=(FileListener)reference.get(); //Removefromlistiftheback-endobjecthasbeenGC'd if(listener==null){ j.remove(); }else{ listener.fileChanged(fileEntry); } } } } }catch(Throwablet){ if(file!=null){ t.printStackTrace(); System.out.println( "filemonitorexecuteerror,file="+file.getAbsolutePath()+ t.getMessage()); }else{ System.out.println( "filemonitorexecuteerror,file=null"+t.getMessage()); } } } }catch(Throwablet){ System.out.println("执行文件监控发生错误"+t.getMessage()); } } } } packagecom.yx.demo.filemonitor; /** *FileListener * *@authoryx *@date2019/12/210:55 */ publicinterfaceFileListener{ /** * *@paramfileEntry */ publicvoidfileChanged(FileEntryfileEntry); }
packagecom.yx.demo.filemonitor;
importjava.io.File; importjava.lang.ref.WeakReference; /** *FileEntry *文件Entry,如果FileEntry指定了FileListener,那么当文件发生变动时只触发指定的FileListener * *@authoryx *@date2019/12/210:56 */ publicclassFileEntry{ Stringid; Filefile; longlastModified; FileListenerfileListener=null; ObjectuserData; WeakReference
使用demo:
//文件路径 StringfileName="conf/database.xml"; //文件监控 FileListenerfileListener=newFileListener(){ @Override publicvoidfileChanged(FileEntryfileEntry){ //TODO文件变化后的业务处理 } }; Filefile=newFile(fileName); FileEntryfileEntry=newFileEntry("database",file); //设置文件监控 fileEntry.setFileListener(fileListener); FileMonitor.getDefaultFileMonitor().addFileEntry(fileEntry);
总结
以上所述是小编给大家介绍的Java实现文件监控器FileMonitor的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。