java 文件监听器_观察者模式实现java的文件监听器

package study.filemoniter;

import java.io.File;

import java.util.Map;

import java.util.Observable;

import java.util.Set;

import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.lang.StringUtils;

/**

*文件监听器 观察者模式,该监听器是一个被观察者

* @author dWX207527

*

*/

public class FileMoniter extends Observable implements Runnable

{

/**

* 是否启动监听

*/

private boolean monitorFlag = true;

/**

* 5秒监听一次

*/

private int interval = 5000;

/**

* 文件容器 key放文件的名称,value放文件的最后修改时间

*/

private Map fileMap = new ConcurrentHashMap();

/**

* 线程方法

*/

@Override

public void run()

{

while(monitorFlag)

{

try

{

Thread.sleep(interval);

checkFile();

} catch (Exception e)

{

e.printStackTrace();

}

}

}

/**

* 检查文件是否更新

*/

private void checkFile()

{

Set fileNames = fileMap.keySet();

for (String fileName : fileNames)

{

// 如果被修改过则通知被观察者

if (isModifide(fileName,fileMap.get(fileName)))

{

setChanged();

notifyObservers(fileName);

}

}

}

/**

* 判断是被修改过

* @param fileName

* @param lastModifyTime

* @return

*/

private boolean isModifide(String fileName,Long lastModifyTime)

{

File file = new File(fileName);

if (file ==null)

{

return false;

}

long time = lastModifyTime;

long lastTime = file.lastModified();

if (lastTime != time)

{

// 然后将文件map放置最新的时间

fileMap.put(fileName, lastTime);

return true;

}

return false;

}

/**

* 新增文件

* @param fileName

*/

public void addFile(String fileName)

{

// 如果文件为空则直接返回

if (StringUtils.isEmpty(fileName))

{

return;

}

Long lastModifyTime = getLastModifyTime(fileName);

fileMap.put(fileName, lastModifyTime);

}

/**

* 得到文件的最后修改时间

* @param fileName

* @return

*/

private Long getLastModifyTime(String fileName)

{

File file = new File(fileName);

if (null == file)

{

return 0L;

}

return file.lastModified();

}

}

package study.filemoniter;

import java.util.Observable;

import java.util.Observer;

/**

* 文件观察者

* @author dWX207527

*

*/

public class FileObserver implements Observer

{

@Override

public void update(Observable o, Object arg)

{

if (!(o instanceof FileMoniter) || !(arg instanceof String))

{

return ;

}

System.out.println("文件有改动");

// 一旦有改动则通知了观察者 观察者进行重新配置文件

String fileName = (String)arg;

FileMap.getInstance().fillFileMap(fileName);

}

}

package study.filemoniter;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.util.HashMap;

import java.util.Map;

import java.util.Properties;

/**

* 文件的容器

* @author dWX207527

*

*/

public class FileMap

{

private Map map = new HashMap();

private static FileMap fileMap = new FileMap();

private FileMap()

{

}

public static FileMap getInstance()

{

return fileMap;

}

public void fillFileMap(String fileName)

{

File file = new File(fileName);

InputStream inStream = null;

try {

inStream = new FileInputStream(file);

if (null == file)

{

return ;

}

Properties properties = new Properties();

properties.load(inStream);

String value = properties.getProperty("name");

map.put("name", value);

}

catch (Exception e) {

e.printStackTrace();

return ;

}

}

public Map getFileMap ()

{

return map;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值