监视目录变化

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. public class 目录监视服务的使用示例 {
  2. public static void 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. }

来自为知笔记(Wiz)

时间: 2024-11-05 19:02:56

监视目录变化的相关文章

[Java 8] 列举目录下的所有文件和监视文件变化

列举目录中的所有文件 首先给出代码: Files.list(Paths.get(".")).forEach(System.out::println); Files.list方法得到的是一个Stream类型的对象,它代表了目标路径下所有的文件.如果只想获取目标路径下的所有目录文件: Files.list(Paths.get(".")) .filter(Files::isDirectory) .forEach(System.out::println); 在以前的Java

Node.js文件模块fs监视文件变化

Node.js文件模块fs监视文件变化 Node中文件模块fs监视文件的函数源码如下: fs.watch = function(filename) { nullCheck(filename); var watcher; var options; var listener; if (util.isObject(arguments[1])) { options = arguments[1]; listener = arguments[2]; } else { options = {}; listen

inotify监控目录变化重启服务器tornado项目

pycharm 配置了提交服务器项目每次pycharm修改后,虽然保存到服务器但是项目还得自己去服务器kill再启动.就花几分钟写了shell脚本用于监控项目目录变化并重启tornado项目的脚本 如果技术不懂需要请联系我 [[email protected] scripts]$ cat realtime_rsync.sh #!/bin/bash #para host01=10.0.0.253 #src=/backup src="/home/liujianzuo/htdocs/tornado/m

Broadcat监视电量变化

/** *检测手机电量变化 * 使用registerReceiver(receiver, intentFilter);来注册广播,而不是在清单文件中注册<receiver><receiver> * 需要添加权限: * <uses-permission android:name="android.permission.BATTERY_STATS"/> * 在onResume()中注册广播 * registerReceiver(receiver, int

C#路径/文件/目录/I/O常见操作汇总

文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供给你一点有益的思路,如果你有好的建议,恳请能够留言,使这些内容更加完善. 主要内容:一.路径的相关操作, 如判断路径是否合法,路径类型,路径的特定部分,合并路径,系统文件夹路径等内容:二.相关通用文件对话框,这些对话框可以帮助我们操作文件系统中的文件和目录:三.文件.目录.驱动器的操作,如获取它们的

目录管理、文件管理、文件查看、文本处理命令

日期: 2015年08月23日 [目录管理类命令] mkdir.rmdir.tree.dirname.basename <<========================================[mkdir]========================================>> mkdir命令 功能: 创建目录 格式: mkdir[OPTION]... DIRECTORY... 常用选项: -p: 先创建父目录: -v: 显示详细信息; 实例: [[emai

Linux文件和目录管理常用命令(中)

ln 命令 描述:ln命令用来为文件创建连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接.如果要创建符号连接必须使用"-s"选项. 注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的. 语法:ln(选项)(参数) 常用选项: -b或--backup              删除,覆盖目标文件之前的备份: -d或-F或--directory     建立目录的硬连接: -f或--force             强

Inotify监视限值不足问题

使用Android Studio导入AOSP源码遇到inotify大小不足的问题,原文即ide推荐的解决方法.Android Studio就是基于IntelliJ平台修改的. 对于一个"聪明"的ide,它应该能知道与它协同工作的外部组件,如VCS.编译工具.代码生成器等,对它管控的文件产生了修改.举例来说,IntelliJ有专门的后台线程去监视这些变化.这个方法根据不同的平台可能实现会有不同,在Linux平台我们用的Inotify工具. Inotify会对工程内的所有文件夹设置&quo

Window Linux下实现指定目录内文件变更的监控方法

转自:http://qbaok.blog.163.com/blog/static/10129265201112302014782/ 对于监控指定目录内文件变更,window 系统提供了两个未公开API:SHChangeNotifyRegister  SHChangeNotifyDeregister 分别用于注册Notify以及监视. 同时,还提供了ReadDirectoryChangesW  函数(貌似NT以上可用). 在 .net framework 中,另提供了封装好的 FileSystem