网站首页 > 精选教程 正文
前言
有时候你可能有个疑问,IDE总是可以检测到外部文件是否发生了变化,比如你在某个类里面加了一些代码,这时候的IDE就会弹出一个框说你做了更改。再或者是某个文件夹下的文件发生了改变,比如新建了一个或者是删除了一个等等。这时候我们的IDE依然可以检测到。这个功能到底是如何实现的呢?这篇文章主要是研究NIO的其中一个类,叫做WatchService。
也有一些其他的方式可以轻松地实现监控文件夹的功能,比如说java轮询的方式,或者是common-io的方式,我会慢慢比较。
OK,我们直接来看一下简单例子如何实现,再去分析如何实现的?
一、代码实现
1、简单案例
这个代码很简单,只需要四步:
public static void main(String[] args) throws Exception {
//第一步:取得WatchService
WatchService watchService = FileSystems.getDefault().newWatchService();
//第二步:确定要监控的路径
Path path = Paths.get("G:\\");
//第三步:为本路径绑定WatchService,并确定监控的事件
path.register(
watchService,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
WatchKey key;
//第四步:当有事件时,开始触发
while ((key = watchService.take()) != null) {
for (WatchEvent<?> event : key.pollEvents()) {
System.out.println("事件" + event.kind() + "发生了,文件是:" + event.context());
}
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其实是有很多缺点的。
鉴于以上原因,在简单的实现时,可以使用,但是还有一个更强大的工具commons-io,使用更简单也更加的高效。下篇文章给出。
猜你喜欢
- 2024-11-07 JMX带你透视Java应用,实现应用程序的动态实时监控
- 2024-11-07 java应用监控和分析思路 java监控gc
- 2024-11-07 巧用JAVA监控工具2——jvisualvm java jvm 监控
- 2024-11-07 老技术新谈,Java应用监控利器JMX(1)
- 2024-11-07 Javaagent 使用 - 探针 jsp探针
- 2024-11-07 详解docker容器的资源监控方案 docker容器资源限制
- 2024-11-07 性能诊断利器 JProfiler 快速入门和最佳实践
- 2024-11-07 java监控工具(1) java视频监控
- 2024-11-07 java通过插桩的概念来完成监控系统的设计
- 2024-11-07 高性能、无侵入的 Java 性能监控神器
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)