1.在实际开发中可能会需要监视某个目录下的文件所发生的变化。
 
2.在java7之前的做法
在一个独立的线程中使用File类的listFiles方法来定时检查目录中的内容,并与之前的内容进行比较
 
3.java7之后的做法
NIO.2中提供了新的目录监视服务,使用这些服务可以在指定目录中的子目录或文件被创建、更新或者删除时得到事件的通知。
基于这些通知,程序可以进行相应的处理
 
4.被监听的对象要实现java.nio.file.Watchable接口,并通过register方法注册到表示监视服务的java.nio.file.Watchable接口的实现对象上
注册时需要指定被监视对象感兴趣的事件类型。
注册成功后,调用者可以得到一个表示这次注册行为的java.nio.file.Watchable接口的实现对象。
 
5.通过WatchKey接口可以获取在对应的被监听对象上所产生的事件。
每个事件用java.nio.file.WatchEvent接口来表示
 
6.WatchService接口也提供了获取当前所有被监视对象上的可用事件。
查询方式分为阻塞式和非阻塞式:
阻塞式使用take方法,而非阻塞式使用poll方法。
查询结果的返回值是WatchKey接口的实现对象。
调用WatchKey接口的pollEvents方法可以得到对应被监视对象上所发生的所有事件
 
例子:
  1. publicclass目录监视服务的使用示例{
  2. publicstaticvoid main(String[] args) throws IOException,InterruptedException{
  3. //WatchService接口的实现对象是由工厂方法创建的,需要从表示文件系统的java.nio.file.FileSystem类对象中得到。
  4. WatchService service =FileSystems.getDefault().newWatchService();
  5. //被监视的对象
  6. Path path =Paths.get("C:/Users/aming/Desktop");
  7. //注册监听事件
  8. //包括创建或者重命名(ENTRY_CREATE),更新(ENTRY_MODIFY)和删除(ENTRY_DELETE)
  9. path.register(service,StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.OVERFLOW);
  10. while(true){
  11. WatchKey key = service.take();
  12. //pollEvents方法获取所有的事件
  13. for(WatchEvent<?> event:key.pollEvents()){
  14. //context方法的返回值表示的是事件上下文信息
  15. //在于目录内容变化相关的事件中,上下文信息是一个Path接口的实现对象
  16. Path createPath =(Path)event.context();
  17. //resolve方法:将当前路径当成父目录,而把参数中的路径当成子目录或者是其中的文件
  18. createPath = path.resolve(createPath);
  19. //获得文件的大小
  20. long size =Files.size(createPath);
  21. System.out.println(createPath +"==>"+ size);
  22. }
  23. //在处理完一个WatchKey接口实现对象中的全部事件后
  24. //需要通过reset方法来进行重置。
  25. //只有重置之后,新的产生的同类事件才有可能从WatchService接口实现对象中再次获取。
  26. key.reset();
  27. //如果希望取消对一个目录的监视
  28. //只需要调用对应的WatcKey接口实现对象的cancel方法即可
  29. key.cancel();
  30. }
  31. }
  32. }
 

Java学习笔记--监视目录变化的更多相关文章

  1. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  2. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  3. java学习笔记(2)注释、public lcass、class、标识符、字面值、变量

    java学习笔记(1)中说过了java的一些基础知识,发展史,特点,编译和运行过程,配置环境变量等,接下来开始介绍java的语法等只是点  关于java源程序中的注释: *什么是注释?注释的作用是什么 ...

  4. java学习笔记之OOP(二)

    java学习笔记二.面向对象[OOP]Object Oriented Programming 一.三大特性: 1.封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用 ...

  5. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  6. Java学习笔记——File类之文件管理和读写操作、下载图片

    Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...

  7. thinkphp学习笔记1—目录结构和命名规则

    原文:thinkphp学习笔记1-目录结构和命名规则 最近开始学习thinkphp,在下不才,很多的问题看不明白所以想拿出来,恕我大胆发在首页上,希望看到的人能为我答疑解惑,这样大家有个互动,学起来快 ...

  8. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  9. Java学习笔记心得——初识Java

    初识Java 拿到这本厚厚的<Java学习笔记>,翻开目录:Java平台概论.从JDK到TDE.认识对象.封装.继承与多态...看着这些似懂非懂的术语名词,心里怀着些好奇与担忧,就这样我开 ...

随机推荐

  1. declare 命令

    declare命令用于声明和显示shell变量. declare为shell指令,命令与 typeset一样,可同时指定多个属性.若不加上任何参数,则会显示全部的shell变量与函数(与执行set指令 ...

  2. ios模拟器bug

    Error: xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Libra ...

  3. 使用 Mono.Cecil 辅助 Unity3D 手游进行性能测试

    Unity3D 引擎在  UnityEngine 名字空间下,提供了  Profiler 类(Unity 5.6 开始似乎改变了这个名字空间),用于辅助对项目性能进行测试.以 Android 平台为例 ...

  4. jQuery遍历节点方法汇总

    1.children()方法:$('div').children()---遍历查找div元素的所有子元素节点 <p>Hello</p> <div> <span ...

  5. [刷题]算法竞赛入门经典 3-4/UVa455 3-5/UVa227 3-6/UVa232

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa455:Periodic Strings 代码: //UVa455 #inclu ...

  6. eclipse C 开发 Stm32

    版权声明:本文为博主原创文章,未经博主允许不得转载. 1.下载eclipse需要的运行环境,JDK/JRE. 在http://wiki.eclipse.org/Eclipse/Installation ...

  7. ztree实现权限功能(横向显示)

    最近在做权限功能的时候,采用的ztree实现的,但是产品要求最后一层的权限节点要横向显示.开始在网上找的解决方案是用css样式把最后一层的display设置为inline.在我本地电脑上看了下.效果不 ...

  8. .Net程序员学用Oracle系列(29):PLSQL 之批量应用和系统包

    1.批量数据操作 1.1.批量生成数据 1.2.批量插入数据 2.批量生成脚本 3.生成数据字典 4.常见系统包 4.1.DBMS_OUTPUT 4.2.DBMS_RANDOM 4.3.其它系统包及常 ...

  9. 013 session_flush

    在hibernate中也存在flush这个功能,在默认的情况下session.commit()之前时,其实执行了一个flush命令. Session.flush功能: ②理缓存: ②执行sql(确定是 ...

  10. AjaxPro.AjaxMethod 简单应用,

    用AjaxPro无刷新实现站内信息实时提示功能,用AjaxPro.2.dll实现表数据绑定和无刷新分页 首先,必不可少的就是dll-----AjaxPro.2 下载地址:http://down7.pc ...