`
janeky
  • 浏览: 365958 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • 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.关闭服务

 

 

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!看看命令行输出的信息吧

 

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文章,欢迎访问http://janeky.iteye.com/category/157060

4
3
分享到:
评论
6 楼 sgq0085 2015-03-09  
import static java.nio.file.StandardWatchEventKinds.*;
5 楼 solemichael 2015-01-14  
遗憾的是只能监控一层目录,下层不能监控了,哎。
4 楼 xiegqooo 2013-08-07  
这功能不错 。
3 楼 javabkb 2011-05-31  
这个功能很有用
2 楼 janeky 2011-05-20  
飞天奔月 写道
这个系列文章写得很好

谢谢关注!
1 楼 飞天奔月 2011-05-19  
这个系列文章写得很好

相关推荐

    JDK7新特性(完整篇)

    6. **JDK7新特性&lt;六&gt; 监听文件系统的更改** 这个特性允许程序注册监听文件或目录的改变,当文件系统发生变动时,可以立即响应,增强了实时性和效率,特别是在文件监控应用中非常有用。 7. **JDK7新特性&lt;七&gt; 遍历...

    jdk7api帮助文档

    `WatchService`接口则允许监听文件系统事件,如文件的创建、删除和修改。 此外,JDK7对异常处理进行了优化,引入了`SuppressedException`,使得在捕获异常时,可以方便地获取并处理其他被抑制的异常。同时,`...

    springboot - 2.7.3版本 - (七)整合Kafka

    2. 修改`config/server.properties`配置文件,设置`broker.id`和`zookeeper.connect`。 3. 启动Zookeeper服务。 4. 启动Kafka服务。 5. 使用命令行工具或管理界面检查Kafka集群的状态。 在`springboot-kafka`目录下...

    jdk1.7 Linux64位官方正式版 jdk-7u80-linux-x64.tar.zip

    5. **改进的文件系统API**:NIO.2提供了对异步I/O和文件属性操作的增强,如WatchService,可以监听文件系统事件。 6. **钻石操作符**:在创建泛型实例时,可以省略类型参数,编译器会根据上下文推断类型,如`List...

    Tomcat服务器配置

    2. **配置步骤**: 在`conf/server.xml`文件中添加相应的`&lt;Context&gt;`元素来定义虚拟目录。例如: ```xml &lt;Context path="/test" docBase="f:\testWeb" reloadable="true"/&gt; ``` - `path`属性定义了虚拟目录的路径...

    JDK1.8 win64位版本下载

    在系统属性的“高级”选项卡中,点击“环境变量”,在系统变量中新建或修改“JAVA_HOME”变量,值设为JDK的安装目录。同时,将“Path”变量的值中添加%JAVA_HOME%\bin,确保命令行能识别Java命令。 JDK1.8引入了...

    activemq自启动并设置用户名密码

    在`/usr/local/apache-activemq/conf/activemq.xml`文件中,找到`&lt;plugins&gt;`部分,并添加或修改`&lt;simpleAuthenticationPlugin&gt;`插件配置: ```xml &lt;plugins&gt; &lt;simpleAuthenticationPlugin&gt; &lt;users&gt; ...

    JDK7 Reference Card 参考指南

    JDK 7 Reference Card 是一个关于 Java 7 的综合性参考指南,旨在帮助开发者快速掌握 Java 7 的新特性与改进。它不仅包含了所有新增的功能,还涵盖了增强和修改过的 JSRs(Java Specification Requests),并总结了...

    jdk1.7.0_71windows-x64安装文件

    `java.nio.file`包提供了新的文件系统API,支持文件系统事件监听。 - **安全增强**:1.7版本增强了对加密和安全协议的支持,以及针对网络通信的安全控制。 - **JVM改进**:包括更好的内存管理,更高效的类加载机制...

    TestNG中文帮助文档(译)

    &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt; &lt;version&gt;2.22.2&lt;/version&gt; &lt;configuration&gt; &lt;suiteXmlFiles&gt; &lt;suiteXmlFile&gt;testng.xml&lt;/suiteXmlFile&gt; &lt;/suiteXmlFiles&gt; &lt;/configuration&gt; &lt;/plugin&gt; &lt;/...

    JDK1.7.07.zip

    另外,WatchService API允许程序监听文件系统事件,如文件创建、修改和删除。 对于数据库连接,JDBC 4.1在JDK 1.7.07中引入了新的功能,如支持预编译的SQL语句的批处理,提高了数据库操作的效率。同时,增强了对...

    Java+JDK+7 Learning notes.zip_java_jdk

    7. Type Inference for Generic Instance Creation:通过“钻石操作符”&lt;&gt;简化泛型实例化。 三、Java内存模型与垃圾回收 理解Java内存模型,包括堆内存、栈内存、方法区(元空间)以及程序计数器等,以及它们在JVM...

    vertxtest.rar

    如果JDK路径不同,找到`pom.xml`中的`maven-compiler-plugin`插件配置,修改`&lt;compilerArgs&gt;`或`&lt;source&gt;`和`&lt;target&gt;`标签的值以匹配你的JDK版本。 【运行与调试】:使用Eclipse IDE,你可以将此项目导入为Maven...

    Tomcat基本配置.pdf

    - `export JAVA_HOME=/usr/local/jdk` (需添加到/etc/bashrc或/etc/profile文件中) - **运行命令**: - **Windows**: 进入Tomcat的bin目录,使用`startup`命令启动Tomcat服务;使用`shutdown`命令关闭服务。 - **...

    Java jdk7.0 API

    - **WatchService**:监视文件系统对象的更改,可以监听目录或文件的创建、删除、修改事件。 3. **集合框架增强**: - **集合接口的新方法**:例如,List接口增加了`forEach()`,Set接口增加了`removeIf...

    有关jdk1.7的压缩包,解压后可以直接使用

    3. **WatchService**:允许程序监听文件系统中的更改事件,如创建、删除和修改。 此外,JDK 1.7在并发和垃圾回收方面也做了优化: 1. **Fork/Join框架**:用于并行执行任务,特别是在处理大量数据时,能显著提高...

    jdk-8u281.rar

    在本文中,我们将深入探讨JDK 8在Windows 64位系统中的安装、配置以及其关键特性。 ### 安装JDK 8 "jdk-8u281-windows-x64.exe" 是JDK 8u281的Windows 64位安装程序。下载并运行这个exe文件后,按照向导指示进行...

    Pure JS (2): 热部署 (利用 JDK 7 NIO 监控文件变化)

    在热部署的场景下,JDK 7的`java.nio.file.WatchService`接口被用来监听文件或目录的变化。开发者可以注册一个或多个文件系统路径到WatchService,然后该服务会触发事件当这些路径中的文件或目录发生创建、删除、...

    JDK1.8的linux版本

    1. **Lambda表达式**:JDK 1.8引入了Lambda表达式,这是一种更简洁、更易读的编写匿名函数的方式,大大简化了处理集合和事件监听等场景的代码。 2. **方法引用和构造器引用**:这些新的语法特性允许直接引用类的...

Global site tag (gtag.js) - Google Analytics