,,Java实现文件监控器FileMonitor的实例代码

,,Java实现文件监控器FileMonitor的实例代码

这篇文章主要介绍了Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)实现文件监控器文件监视器的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

应用场景:

代码可以实现文件变化后的监听,如文件变化,自动重新加载文件内容,实现配置文件的热部署。

代码:

包com。yx。演示。文件监视器;

导入Java。io。文件;

导入Java。郎。参考文献。弱引用;

导入Java。util。ArrayList

导入Java。util。收藏;

导入Java。util。hashmap

导入Java。util。迭代器;

导入Java。util。列表;

导入Java。util。计时器;

导入Java。util。timertask

/**

*文件监视器

* 文件监控器

*

* @作者yx

* @日期2019/12/21 0:59

*/

公共类文件监视器{

/**

* 每2秒更新的默认监控器

*/

私有静态文件监视器默认文件监视器=新文件监视器(2 * 1000);

私人计时器timer _;

private HashMapFile,文件入口files _;//文件长度

private ListFileEntry fileEntrys=new Java。util。并发。copyonwritearraylistfileentry();

private CollectionWeakReferenceFileListener listeners _;//of WeakReference(FileListener)

私有长轮询间隔=10000

公共静态文件监视器getDefaultFileMonitor() {

返回defaultFileMonitor

}

/**

*创建具有指定轮询间隔的文件监视器实例。

*

* @param pollingInterval轮询间隔,以毫秒为单位。

*/

公共文件监视器(长轮询间隔){

这个。轮询间隔=轮询间隔;

files_=new HashMapFile,file entry();

listeners _=new ArrayListWeakReferenceFileListener();

计时器_=新计时器(' FileMonitor ',true);

计时器_ .schedule(new FileMonitorNotifier(),0,轮询间隔);

}

/**

*停止文件监视器轮询。

*/

公共无效站点(){

计时器_ .cancel();

定时器_=空

}

public void start() {

if (timer_==null) {

计时器_=新计时器(真);

计时器_ .schedule(new FileMonitorNotifier(),0,轮询间隔);

}

}

/**

*添加要监听的文件。文件可以是任何java.io.File(包括

*目录)中,并且很可能是一个不存在的文件

*文件的创建将被中断。

* p

*可以监听多个文件。当指定的文件为

*创建、修改或删除时,监听器会得到通知。

*

* @param文件要监听的文件。

*/

公共void addFile(字符串id,文件文件){

如果(!文件_。包含密钥(文件)){

FileEntry entry=new FileEntry(id,file,file.exists()?文件。last modified():-1);

文件_。放(文件,条目);

}

}

/**

* 添加监控文件实体。

*

* @param fileEntry

*/

公共void addfile条目(文件条目file条目){

如果(!文件入口。包含(文件条目)){

文件入口。添加(文件条目);

}

}

/**

* 通过文件实体的标识判断监控文件实体是否存在。

*

* @param id

* @返回

*/

公共布尔文件入口存在(字符串id) {

if (id==null) {

返回错误的

}

for(int I=0;我提交了申请。size();i ) {

if (id.equals(fileEntrys.get(i)).getId())) {

返回真实的

}

}

返回错误的

}

/**

* 通过文件实体标识删除一个监控文件实体。

*

* @param id

*/

公共void removeFileEntry(字符串id) {

if (id==null) {

返回;

}

for(int I=0;我提交了申请。size();i ) {

if (id.equals(fileEntrys.get(i)).getId())) {

文件入口。删除;

返回;

}

}

}

/**

*删除指定的监听文件。

*

* @param文件要删除的文件。

*/

公共void删除文件(文件File){

文件_。删除(文件);

}

/**

*将侦听器添加到此文件监视器。

*

* @param fileListener要添加的侦听器。

*/

public void addListener(文件侦听器文件侦听器){

//如果已经存在,就不要添加

for(IteratorWeakReferenceFileListener I=listeners _ .迭代器();I .有next();) {

WeakReferenceFileListener reference=I . next();

文件监听器监听器=(文件监听器)引用。get();

if (listener==fileListener) {

返回;

}

}

//使用弱引用避免内存泄漏,如果这成为

//对象的唯一引用。

听众_。add(新WeakReferenceFileListener(文件侦听器));

}

/**

*从此文件监视器中删除侦听器。

*

* @param fileListener要删除的侦听器。

*/

公共void删除侦听器(文件侦听器文件侦听器){

for(IteratorWeakReferenceFileListener I=listeners _ .迭代器();I .有next();) {

WeakReferenceFileListener reference=(WeakReferenceFileListener)I . next();

文件监听器监听器=(文件监听器)引用。get();

if (listener==fileListener) {

I . remove();

打破;

}

}

}

/**

*这是每n毫秒执行一次的计时器线程,根据

*对文件监视器的设置。它会调查有问题的文件

*并在发生变化时通知监听器。

*/

私有类文件监控通知程序扩展TimerTask {

@覆盖

公共无效运行(){

尝试{

for(迭代器文件入口I=文件入口。迭代器();I .有next();) {

尝试{

文件入口entry=I . next();

if (entry==null ||!entry.check()) {

I . remove();

}

} catch (Throwable t) {

t。printstacktrace();

System.out.println('执行文件监控发生错误:' t . getmessage());

}

}

//对注册的文件进行循环,查看哪些文件发生了更改。

//使用列表的副本,以防侦听器想要更改

//在其文件已更改方法中列出。

集合文件files=new ArrayList file(files _ .keySet());

for(迭代器文件I=文件。迭代器();I .有next();) {

file file=I . next();

尝试{

FileEntry fileEntry=files_ .获取(文件);

long lastModifiedTime=文件条目。getlastmedified();

长新修改时间=文件。存在()?文件。last modified():-1;

//记录器。调试(文件。getabsolutepath());

//logger.debug(' {}={} ',lastModifiedTime,newModifiedTime);

//检查文件是否已更改

if (newModifiedTime!=lastModifiedTime) {

//logger.debug('file changed {})',file。getabsolutepath());

文件入口。setlastmedified(新的修改时间);

//注册新的修改时间

文件_。put(文件,文件入口);

if (fileEntry.getFileListener()!=null) {

getFileListener().文件已更改(文件条目);

}否则{

//通知侦听器

for(IteratorWeakReferenceFileListener j=

听众_。迭代器();j .有next();) {

WeakReferenceFileListener引用=

(WeakReferenceFileListener)j . next();

文件监听器监听器=(文件监听器)引用。get();

//如果后端对象已被GC'd,则从列表中移除

if (listener==null) {

j。移除();

}否则{

听众。文件已更改(文件条目);

}

}

}

}

} catch (Throwable t) {

如果(文件!=null) {

t。printstacktrace();

System.out.println(

文件监视器执行错误,file=' file.getAbsolutePath()

t。getmessage());

}否则{

System.out.println(

文件监视器执行错误,file=null ' t . getmessage());

}

}

}

} catch (Throwable t) {

System.out.println('执行文件监控发生错误t . getmessage());

}

}

}

}

包com。yx。演示。文件监视器;

/**

*文件监听器

*

* @作者yx

* @日期2019/12/21 0:55

*/

公共接口FileListener {

/**

*

* @param fileEntry

*/

公共void文件已更改(文件条目文件条目);

}

包com。yx。演示。文件监视器;

导入Java。io。文件;

导入Java。郎。参考文献。弱引用;

/**

*文件条目

* 文件条目,如果文件入口指定了文件监听器,那么当文件发生变动时只触发指定的文件监听器

*

* @作者yx

* @日期2019/12/21 0:56

*/

公共类文件条目{

字符串id;

文件文件;

长lastModified

文件监听程序文件监听程序=空

对象用户数据

WeakReferenceObject引用=空

/**

* 构造函数。

*

* @param id

* @param文件

*/

公共文件条目(字符串id,文件文件){

this(id,file,file.exists()?文件。last modified():-1);

}

公共文件条目(对象引用、字符串身份证,文件文件){

this(id,file,file.exists()?文件。last modified():-1);

reference=new WeakReferenceObject(reference);

}

/**

* 构造函数。

*

* @param id标识

* @param文件要监控的文件

* @param lastmodified最后修改日期

*/

公共文件条目(字符串id,文件文件,long lastmodified) {

super();

this.id=id

this.file=file

这个。上次修改=上次修改;

}

公共布尔校验(){

如果(参考!=null reference.get()==null) {

//监控对象已经不存在,请求文件监视器删除自己

返回错误的

}

长新修改时间=文件。存在()?文件。last modified():-1;

if (lastModified!=newModifiedTime) {

这个。上次修改时间=新的修改时间;

文件侦听器ls=this。getfile listener();

if (ls==null) {

返回错误的

}否则{

尝试{

ls。文件已更改(this);

} catch(异常e) {

e。printstacktrace();

System.err.println('执行文件监控事件监听e . getmessage());

}

返回真实的

}

}否则{

返回真实的

}

}

公共字符串getId() {

返回id;

}

公共void集合id(字符串id) {

this.id=id

}

公共文件getFile() {

返回文件;

}

公共void setFile(文件文件){

this.file=file

}

public long getlastmedified(){

返回上次修改时间

}

public void setlastmedified(long lastmedified){

这个。上次修改=上次修改;

}

公共FileListener getFileListener() {

返回文件监听器

}

public void setfile listener(文件侦听器文件侦听器){

这个。文件监听器=文件监听器;

}

公共对象getUserData() {

返回用户数据;

}

公共空集用户数据(对象用户数据){

这个。用户数据=用户数据;

}

}

使用演示:

//文件路径

字符串fileName=' conf/database。XML ';

//文件监控

文件监听器文件监听器=新文件监听器(){

@覆盖

公共无效文件已更改(文件条目文件条目){

//TODO文件变化后的业务处理

}

};

文件文件=新文件(文件名);

文件条目file entry=新文件条目('数据库',文件);

//设置文件监控

文件入口。setfile listener(文件监听器);

文件监视器。getdefaultfilemonitor().addFileEntry(文件入口);

总结

以上所述是小编给大家介绍的Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)实现文件监控器文件监视器的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: