Observer模式应用 ---文件改变监视器

 

FileChangedEvent 文件Change 事件

package  blog.csdn.net.huangbin;

import  java.util.EventObject;

public   class  FileChangedEvent 
     
extends  EventObject
    
{
    
private static final long serialVersionUID = 1L;
    
private String fileName;
      
private long lastModifyTime;

      
public FileChangedEvent(Object pSource)
      
{
        
super(pSource);
      }


      
public String getFileName() {
        
return fileName;
      }

      
public void setFileName(String fileName) {
        
this.fileName = fileName;
      }

      
public void setLastModifyTime(long lastModifyTime) {
        
this.lastModifyTime = lastModifyTime;
      }

      
public long getLastModifyTime() {
        
return lastModifyTime;
      }

    }


文件Changed监听器

package  blog.csdn.net.huangbin;

import  java.util.EventListener;

public   interface  FileChangedListener  extends  EventListener
{
   
public void contentChanged(FileChangedEvent pEvent);
}

接口

package  blog.csdn.net.huangbin;


public   interface  FileMonitor  {
       
public void register(String pFileName);

       
public void register(java.util.Set pFileSet);

       
public boolean isRegisted(String pFileName);

       
public void unregister(String pFileName);

       
public String[] getFiles();

       
public void addFileChangedListener(FileChangedListener pListener);

       
public void removeFileChangedListener(FileChangedListener pListener);

       
public FileChangedListener[] getFileChangedListeners();

       
public void start();

       
public void restart();

       
public boolean isRunning();

       
public int getDelay();

       
public void setDelay(int pDelay);
     }

实现

 

package  blog.csdn.net.huangbin;
import  java.awt.event.ActionEvent;
import  java.awt.event.ActionListener;
import  java.io.File;
import  java.util.HashMap;
import  java.util.Map;
import  java.util.Set;

import  javax.swing.Timer;
import  javax.swing.event.EventListenerList;
import  org.apache.commons.logging.Log;
import  org.apache.commons.logging.LogFactory;

public   class  DefaultFileMonitor   implements  FileMonitor,
    ActionListener
{
  
private final Log log = LogFactory.getLog(DefaultFileMonitor.class);
  
public static final int DEFAULT_DELAY = 500;

  
public DefaultFileMonitor(){
    monitorTimer 
= new Timer(DEFAULT_DELAY,this);
    
this.start();
  }


  
private Map fileMap = new HashMap();

  
//执行文件改变检查.
  public void actionPerformed(ActionEvent e){
    String[] files 
= getFiles();
    
for(int i=0; i<files.length; i++){
     FileChangedEvent info 
= (FileChangedEvent)fileMap.get(files[i]) ;
     
long lastModifyTime = getModifyTime(files[i]);
     
if ( lastModifyTime > info.getLastModifyTime() ){
       info.setLastModifyTime(lastModifyTime);
       fireFileChangedListener(info);
     }
//end if
    }
//end for
  }


  
public void register(String pFileName) {
    FileChangedEvent info 
= new FileChangedEvent(this);
    
long lastModifyTime = getModifyTime(pFileName);
    info.setFileName(pFileName);
    info.setLastModifyTime(lastModifyTime);
    fileMap.put(pFileName, info);
  }


  
public void register(Set pFileSet) {
    String[] files 
=  (String[])pFileSet.toArray(new String[0]);
    
for(int i=0; i<files.length; i++){
      register(files[i]);
    }

  }


  
public void unregister(String pFileName) {
    fileMap.remove(pFileName);
  }


  
public boolean isRegisted(String pFileName){
    
return fileMap.containsKey(pFileName);
  }



  
public String[] getFiles() {
    
return (String[])fileMap.keySet().toArray(new String[0]);
  }


  
public void addFileChangedListener(FileChangedListener pListener) {
    listenerList.add(FileChangedListener.
class, pListener);
  }


  
public void removeFileChangedListener(FileChangedListener pListener) {
    listenerList.remove(FileChangedListener.
class, pListener);
  }


  
public FileChangedListener[] getFileChangedListeners() {
    
return (FileChangedListener[])listenerList.getListeners(FileChangedListener.class);
  }

  
protected void fireFileChangedListener(FileChangedEvent pEvent){
    Object[] listeners 
= listenerList.getListenerList();
    
for (int i=listeners.length-2; i>=0; i-=2{
      
if (listeners[i]==FileChangedListener.class{
        ((FileChangedListener)listeners[i
+1]).contentChanged(pEvent);
      }

    }

  }


  
public void start() {
    monitorTimer.start();
  }


  
public void restart() {
    monitorTimer.restart();
  }


  
public boolean isRunning() {
    
return monitorTimer.isRunning();
  }


  
public int getDelay() {
    
return monitorTimer.getDelay();
  }


  
public void setDelay(int pDelay) {
    monitorTimer.setDelay(pDelay);
  }


  
private  long getModifyTime(String pFileName){
    
long result = 0;
    File aFile 
= null;
    aFile 
= new File(pFileName);
    
if ( aFile.exists() == false){
        
throw new IllegalArgumentException("文件:" + pFileName + " 不存在!");
    }

    
if ( aFile.isFile() == false ){
        
throw new IllegalArgumentException( pFileName + " 不是有效的文件");
    }

    result 
= aFile.lastModified();
    
return result;
  }


  
private Timer monitorTimer = null;

  
protected EventListenerList listenerList = new EventListenerList();

  
public static void main(String[] args) {

  }


}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值