`

JDK7新特性 监听文件系统的更改

 
阅读更多

我们用IDE(例如Eclipse)编程,外部更改了代码文件,IDE马上提升“文件有更改”。Jdk7的NIO2.0也提供了这个功能,用于监听文件系统的更改。它采用类似观察者的模式,注册相关的文件更改事件(新建,删除……),当事件发生的,通知相关的监听者。

 

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

 

实现流程如下

 

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

2.为你想监听的目录注册 watcher。注册时,要注明监听那些事件。

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

4.从watcher的queue查找到key,你可以从中获取到文件名等相关信息

5.遍历key的各种事件

6.重置 key,重新等待事件

7.关闭服务

  1. import java.io.IOException;  
  2. import java.nio.file.FileSystems;  
  3. import java.nio.file.Path;  
  4. import java.nio.file.Paths;  
  5. import java.nio.file.WatchEvent;  
  6. import java.nio.file.WatchKey;  
  7. import java.nio.file.WatchService;  
  8. import static java.nio.file.StandardWatchEventKind.*;  
  9.   
  10. /** 
  11.  * @author kencs@foxmail.com 
  12.  */  
  13. public class TestWatcherService {  
  14.       
  15.     private WatchService watcher;  
  16.       
  17.     public TestWatcherService(Path path)throws IOException{  
  18.         watcher = FileSystems.getDefault().newWatchService();  
  19.         path.register(watcher, ENTRY_CREATE,ENTRY_DELETE,ENTRY_MODIFY);  
  20.     }  
  21.       
  22.     public void handleEvents() throws InterruptedException{  
  23.         while(true){  
  24.             WatchKey key = watcher.take();  
  25.             for(WatchEvent<?> event : key.pollEvents()){  
  26.                 WatchEvent.Kind kind = event.kind();  
  27.                   
  28.                 if(kind == OVERFLOW){//事件可能lost or discarded   
  29.                     continue;  
  30.                 }  
  31.                   
  32.                 WatchEvent<Path> e = (WatchEvent<Path>)event;  
  33.                 Path fileName = e.context();  
  34.                   
  35.                 System.out.printf("Event %s has happened,which fileName is %s%n"  
  36.                         ,kind.name(),fileName);  
  37.             }  
  38.             if(!key.reset()){  
  39.                 break;  
  40.             }  
  41.         }  
  42.     }  
  43.       
  44.     public static void main(String args[]) throws IOException, InterruptedException{  
  45.         if(args.length!=1){  
  46.             System.out.println("请设置要监听的文件目录作为参数");  
  47.             System.exit(-1);  
  48.         }  
  49.         new TestWatcherService(Paths.get(args[0])).handleEvents();  
  50.     }  
  51. }  
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.StandardWatchEventKind.*;

/**
 * @author kencs@foxmail.com
 */
public class TestWatcherService {
    
    private WatchService watcher;
    
    public TestWatcherService(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();
                
                if(kind == OVERFLOW){//事件可能lost or discarded
                    continue;
                }
                
                WatchEvent<Path> e = (WatchEvent<Path>)event;
                Path fileName = e.context();
                
                System.out.printf("Event %s has happened,which fileName is %s%n"
                        ,kind.name(),fileName);
            }
            if(!key.reset()){
                break;
            }
        }
    }
    
    public static void main(String args[]) throws IOException, InterruptedException{
        if(args.length!=1){
            System.out.println("请设置要监听的文件目录作为参数");
            System.exit(-1);
        }
        new TestWatcherService(Paths.get(args[0])).handleEvents();
    }
}

 

 

接下来,见证奇迹的时刻

1.随便新建一个文件夹例如 c:\\test
2.运行程序 java TestWatcherService c:\\test
3.在该文件夹下新建一个文件本件“新建文本文档.txt
4.将上述文件改名为abc.txt
5.打开文件,输入点什么吧,再保存。
6.Over!看看命令行输出的信息吧

 



  1. Event ENTRY_CREATE has happened,which fileName is 新建文本文档.txt  
  2. Event ENTRY_DELETE has happened,which fileName is 新建文本文档.txt  
  3. Event ENTRY_CREATE has happened,which fileName is abc.txt  
  4. Event ENTRY_MODIFY has happened,which fileName is abc.txt  
  5. Event ENTRY_MODIFY has happened,which fileName is abc.txt  
Event ENTRY_CREATE has happened,which fileName is 新建文本文档.txt
Event ENTRY_DELETE has happened,which fileName is 新建文本文档.txt
Event ENTRY_CREATE has happened,which fileName is abc.txt
Event ENTRY_MODIFY has happened,which fileName is abc.txt
Event ENTRY_MODIFY has happened,which fileName is abc.txt



分享到:
评论

相关推荐

    JDK7新特性(完整篇)

    1.1 JDK7新特性&lt;一&gt;概述 . . . . . . . . . ....1.2 JDK7新特性&lt;二&gt; 语法 ....1.6 JDK7新特性&lt;六&gt; 监听文件系统的更改 1.7 JDK7新特性&lt;七&gt; 遍历文件树 . . . . . . . 1.8 JDK7新特性&lt;八&gt;异步io/AIO . . . . . . . .

    Java典型模块

    3.1 Java的一些简单新特性 3.1.1 静态导入 3.1.2 可变参数函数 3.1.3 增强版for循环 3.1.4 基本数据的拆、装箱操作(autoboxing和unboxing) 3.2 枚举 3.2.1 枚举的实现原理 3.2.2 枚举的简单应用 3.2.3 枚举的高级...

    Java2核心技术.part5

    4.2.3更改器方法与访问器方法 4.3用户自定义类 4.3.1一个Employee类 4.3.2多个源文件的使用 4.3.3解析Employee类 4.3.4从构造器开始 5.2.2相等测试与继承 5.2.3 hashCode方法 5.2.4 ...

    Java2核心技术.part3

    4.2.3更改器方法与访问器方法 4.3用户自定义类 4.3.1一个Employee类 4.3.2多个源文件的使用 4.3.3解析Employee类 4.3.4从构造器开始 5.2.2相等测试与继承 5.2.3 hashCode方法 5.2.4 ...

    Spring.3.x企业应用开发实战(完整版).part2

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    Java2核心技术.part1

    4.2.3更改器方法与访问器方法 4.3用户自定义类 4.3.1一个Employee类 4.3.2多个源文件的使用 4.3.3解析Employee类 4.3.4从构造器开始 5.2.2相等测试与继承 5.2.3 hashCode方法 5.2.4 toString方法 ...

    Java2核心技术.part6

    4.2.3更改器方法与访问器方法 4.3用户自定义类 4.3.1一个Employee类 4.3.2多个源文件的使用 4.3.3解析Employee类 4.3.4从构造器开始 5.2.2相等测试与继承 5.2.3 hashCode方法 5.2.4 ...

    Java2核心技术.part4

    4.2.3更改器方法与访问器方法 4.3用户自定义类 4.3.1一个Employee类 4.3.2多个源文件的使用 4.3.3解析Employee类 4.3.4从构造器开始 5.2.2相等测试与继承 5.2.3 hashCode方法 5.2.4 ...

    Java2核心技术.part2

    4.2.3更改器方法与访问器方法 4.3用户自定义类 4.3.1一个Employee类 4.3.2多个源文件的使用 4.3.3解析Employee类 4.3.4从构造器开始 5.2.2相等测试与继承 5.2.3 hashCode方法 5.2.4 ...

    Spring3.x企业应用开发实战(完整版) part1

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例011 为Eclipse添加新的JDK环境 17 实例012 设置Eclipse中文API提示信息 18 实例013 为项目添加类库 20 实例014 使当前项目依赖另一个项目 21 1.3 界面设计器 22 实例015 安装界面设计器 22 实例016 设计Windows...

    ssh(structs,spring,hibernate)框架中的上传下载

    这是Hibernate3引入的新特性,对于包含重量级大数据的表字段,这种抽取方式提高了对大字段操作的灵活性,否则加载Tfile对象的结果集时如果总是返回fileContent,这种批量的数据抽取将可以引起数据库的"洪泛效应"。...

    JDBC 3.0数据库开发与设计

    2.3.1 Tomcat的安装及系统文件设置 2.3.2 WebSphere简介 2.3.3 WebLogic的安装和配置 2.3.4 Resin的安装与配置 2.4 Java开发环境 2.4.1 JDK设置 2.4.2 JBuilder的配置 2.4.3 Cafe的配置 2.4.4 JDeveloper的...

    精通ANDROID 3(中文版)1/2

    1.1 面向新PC的全新平台  1.2 Android的历史  1.3 Dalvik VM剖析  1.4 理解Android软件栈  1.5 使用Android SDK开发最终用户应用程序  1.5.1 Android模拟器  1.5.2 Android UI  1.5.3 Android基础...

    精通Android 3 (中文版)2/2

    1.1 面向新PC的全新平台  1.2 Android的历史  1.3 Dalvik VM剖析  1.4 理解Android软件栈  1.5 使用Android SDK开发最终用户应用程序  1.5.1 Android模拟器  1.5.2 Android UI  1.5.3 Android基础...

Global site tag (gtag.js) - Google Analytics