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
privateListfileEntrys=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();){
WeakReferencereference=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();){
WeakReferencereference=(WeakReference)i.next();
FileListenerlistener=(FileListener)reference.get();
if(listener==fileListener){
i.remove();
break;
}
}
}
/**
*Thisisthetimerthreadwhichisexecutedeverynmillisecondsaccording
*tothesettingofthefilemonitor.Itinvestigatesthefileinquestion
*andnotifylistenersifchanged.
*/
privateclassFileMonitorNotifierextendsTimerTask{
@Override
publicvoidrun(){
try{
for(Iteratori=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.
Collectionfiles=newArrayList(files_.keySet());
for(Iteratori=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();){
WeakReferencereference=
(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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。