前言

有时候你可能有个疑问,IDE总是可以检测到外部文件是否发生了变化,比如你在某个类里面加了一些代码,这时候的IDE就会弹出一个框说你做了更改。再或者是某个文件夹下的文件发生了改变,比如新建了一个或者是删除了一个等等。这时候我们的IDE依然可以检测到。这个功能到底是如何实现的呢?这篇文章主要是研究NIO的其中一个类,叫做WatchService。

也有一些其他的方式可以轻松地实现监控文件夹的功能,比如说java轮询的方式,或者是common-io的方式,我会慢慢比较。

OK,我们直接来看一下简单例子如何实现,再去分析如何实现的?

一、代码实现1、简单案例

这个代码很简单,只需要四步:

public static void main(String[] args) throws Exception {    //第一步:取得WatchService    WatchService watchService = ().newWatchService();    //第二步:确定要监控的路径    Path path = ("G:\\");    //第三步:为本路径绑定WatchService,并确定监控的事件    (        watchService,        ,        ,        );    WatchKey key;    //第四步:当有事件时,开始触发    while ((key = ()) != null) {        for (WatchEvent<?> event : key.pollEvents()) {           System.out.println("事件" + () + "发生了,文件是:" + ());        }        key.reset();    } } 

这里我们监控G盘,然后我们在G盘新建文件,然后删除修改,就会在后台打印相关信息。

现在就可以监控了,很简单。

2、代码分析

第一步和第二步,新建一个取得WatchService和取得要监控的路径,这个很容易理解。

第三步绑定,这里只需要注意两件重要的事情:首先,path将watchService作为第一个参数,然后是StandardWatchEventKinds的变量参数。一共有四种。

  • —当有新文件时触发。可能是创建了一个新文件。
  • —当文件被修改时触发。所有的文件编辑都会触发这个事件。在一些平台上,甚至改变文件属性也会触发它。
  • —当文件被删除、移动或重命名时触发。
  • —触发表示丢失或丢弃的事件。

第四步不断监控,当watchService里面不为空时,开始获取相应的事件,并poll弹出。最后还有一个reset 表示回退到相应的句柄,继续处理下一次事件。

3、源码分析

由于watchService是一个接口,所以分析起来也比较简单。里面一共包含了三个方法

//方法1:关闭watchService @Override void close() throws IOException; //方法2:弹出事件 WatchKey poll(); //方法3:带有参数的弹出 WatchKey poll(long timeout, TimeUnit unit)         throws InterruptedException; //方法4:获取事件。 WatchKey take() throws InterruptedException; 

由于方法比较简单,所以我们可以直接看方法上的注释就可以了。

结论

WatchService接口是在java7的版本中引入的。主要是处理NIO的文件相关问题。但是WatchService其实是有很多缺点的。

WatchService是采用扫描式的,效率低。

WatchService代码写起来费劲。虽然上面看起来很简洁了,但是实际开发时麻烦。

WatchService不能监听到多级目录,事先父文件夹需要存在。

鉴于以上原因,在简单的实现时,可以使用,但是还有一个更强大的工具commons-io,使用更简单也更加的高效。下篇文章给出。

【编辑推荐】

【责任编辑:

武晓燕

TEL:(010)68476606】

点赞 0

java如何调用同目录下的文件_文件目录发生了增删改操作?Java如何实时监控?...相关推荐

  1. java resouce_Java 获取Resource目录下的文件解决办法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Java 获取Resource目录下的 文件 有两种方式: Java代码中的类,要获取Resource资源 文件目录 下文件 绝对路径寻址 注意这个 / ...

  2. java 检测目录下的文件_如何在Java中检查文件是目录还是文件

    java 检测目录下的文件 java.io.File class contains two methods using which we can find out if the file is a d ...

  3. java生成skp缩略图,目录下SketchUp文件联系表(自定义尺寸的缩略图集)怎样制作?...

    百度 '批量生成skp缩略图jpg图片-ruby代码' 批量生成Skp缩略图Jpg图片-Ruby代码 渲染·后期·输出 BY SKETCHUP 不需要装什么软件, 草图大师SketchUp文件的缩略图 ...

  4. django 引入同目录下py文件_快速开发一个简单的Django网站

    一.创建工程 1. 在cmd中输入:django-admin.py startproject projectname 2. 修改settings.py文件:在installedapp中增加需要创建的应 ...

  5. java 学生信息的增删改查_学生信息的增删改查(java)

    学生信息的增删改查 注意:此处用到的是access数据库. 运行后效果如图: 代码如下: package example; import java.awt.*; import java.awt.eve ...

  6. python 目录下的文件_用python把文件夹下的所有文件包括文件夹里面的文件都拷贝到同一个目录下...

    比如1文件夹下有2文件夹,2文件夹下有1.txt文件和3文件夹,3文件夹下有2.txt3.txt现在要把1.txt2.txt3.txt全都拷贝到1文件夹下importosimportshutildef ...

  7. python 邮件发送附件 本目录下所有文件_为python中的每个txt文件发送附件电子邮件...

    我有多个文件的一部分预定义的路径,我正在尝试为每一个txt文件生成电子邮件. 下面的代码只工作一次,但是每封电子邮件的每个文件都会递增.在 你的意见/建议会很有帮助的. 谢谢, 艾尔#!/usr/bi ...

  8. 【Java基础】递归输出目录下所有文件路径

    递归输出目录下所有文件路径 import java.io.File;public class FileTest {public static void main(String[] args) {// ...

  9. java resource file_Java 获取Resource目录下的文件解决办法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Java 获取Resource目录下的 文件 有两种方式: Java代码中的类,要获取Resource资源 文件目录 下文件 绝对路径寻址 注意这个 / ...

最新文章

  1. R语言构建xgboost模型:使用xgboost的第一颗树(前N颗树)进行预测推理或者使用全部树进行预测推理、比较误分类率指标
  2. Linux C编程--打开和关闭流
  3. php教学小结,php小结
  4. 想在“双十一”做“爆款”?你的数据库存能支撑吗?
  5. 页面仔 很丢人么?前端越来越不好干了
  6. Android camera (12)---camera ap在特殊的应用场景下额外使用一套独立的camera tuning参数
  7. python contextlib
  8. 解决博客园中代码着色问题
  9. java final 内存语义_final 域的内存语义
  10. matplotlib--python的数据可视化二
  11. 韩顺平java30天Utils包下的工具类
  12. VSCode下载安装教程(Windows 10)
  13. 语法长难句【刘晓艳】英语
  14. 微信小程序:全新圣诞节头像框制作生成微信小程序源码下载支持多模板
  15. 论文的摘要算不算字数?
  16. django-查询语句(一)
  17. 新东方尹圆圆老师的博客上找来的
  18. Python爬虫实战--58同城二手商品爬虫
  19. 迁移服务器和切换域名
  20. rk3288 linux 编译,RK3288系统编译及环境搭建

热门文章

  1. collator java_Java Collator getInstance(Locale)用法及代码示例
  2. Linux VMware 快照不准,VmWare Workstation 关于Linux 虚拟机快照或克隆后 识别不到网卡问题...
  3. python文件路径改了需要重新配置环境吗_Django 设置多环境配置文件载入问题
  4. python与matlab哪个更容易学-详解python和matlab的优势与区别
  5. HTML 内容不能被选择,不能被复制
  6. Java堆溢出错误:java.lang.OutOfMemoryError: Java heap space
  7. C#如何将两个List集合合并
  8. Android开发笔记(八十九)单例模式
  9. Android开发笔记(四十七)Runnable接口实现多线程
  10. 关于单点登录的一些资料(转)