JDK7的WatchServide监听文件系统

JDK7引入WatchService监听文件系统,采用类似观察者的模式,注册相关的文件更改事件(新建,删除,修改,重命名等),当事件发生的,通知相关的监听者。

java.nio.file.*包提供了一个文件更改通知API,叫做Watch Service API.

实现流程如下

(1)为文件系统创建一个WatchService 实例 watcher

watcher = FileSystems.getDefault().newWatchService(); 

(2)为你想监听的目录注册 watcher。注册时,要注明监听的事件。

path.register(watcher, ENTRY_CREATE,ENTRY_DELETE,ENTRY_MODIFY);

(3)在无限循环里面等待事件的触发。当一个事件发生时,key发出信号,并且加入到watcher的queue

(4)从watcher的queue查找到key,你可以从中获取到文件名、发生的事件等相关信息

(5)遍历key的各种事件

(6)重置 key,重新等待事件

(7)关闭服务

具体代码:

import java.io.IOException;     
import java.nio.file.FileSystems;     
import java.nio.file.Path;     
import java.nio.file.Paths;     
import java.nio.file.WatchEvent;     
import java.nio.file.WatchKey;     
import java.nio.file.WatchService;     
import static java.nio.file.StandardWatchEventKinds.*;     
    
/**    
 * WatchService API使用实例
 * @author xHong   
 */    
public class watchserviceTest {     
         
    private WatchService watcher;     
         
    public watchserviceTest(Path path)throws IOException{     
        watcher = FileSystems.getDefault().newWatchService();     
        path.register(watcher, ENTRY_CREATE,ENTRY_DELETE,ENTRY_MODIFY);     
    }     
         
    public void handleEvents() throws InterruptedException{     
        while(true){     
            WatchKey key = watcher.take();     
            for(WatchEvent event : key.pollEvents()){     
                WatchEvent.Kind kind = event.kind();     
                //事件可能lost or discarded
                if(kind == OVERFLOW){     
                    continue;     
                }     
                     
                WatchEvent e = (WatchEvent)event;     
                Path fileName = (Path)e.context();     
                     
                //System.out.printf("Event %s has happened,which fileName is %s%n"    
                  //      ,kind.name(),fileName);
                if(kind.name() == "ENTRY_CREATE")
                {
                	System.out.println(fileName + "-----> 创建!" );
                }else if(kind.name() == "ENTRY_DELETE" ){
                	System.out.println(fileName + "-----> 删除!");
                }else if(kind.name() == "ENTRY_MODIFY"){
                	System.out.println(fileName + "-----> 修改!");
                }
                //System.out.printf("%s -----> %s%n",fileName,kind.name());
            }     
            if(!key.reset()){     
                break;     
            }     
        }     
    }     
         
    public static void main(String args[]) throws IOException, InterruptedException{     
        /*
    	if(args.length!=1){     
            System.out.println("请设置要监听的文件目录作为参数");     
            System.exit(-1);     
        }   */
    	String watchDir = "f:/test";
        new watchserviceTest(Paths.get(watchDir)).handleEvents();     
    }     
}   



你可能感兴趣的:(java,jdk)