观察者模式实现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<String,Long> fileMap = new ConcurrentHashMap<String, Long>();
	
	/**
	 * 线程方法
	 */
	@Override
	public void run() 
	{
		while(monitorFlag)
		{
			try 
			{
				Thread.sleep(interval);
				
				checkFile();
			} catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 检查文件是否更新
	 */
	private void checkFile()
	{
		Set<String> 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<String,String> map  = new HashMap<String, String>();
	
	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<String,String> getFileMap ()
	{
		return map;
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值