小弟最近在项目里用jNotify来监控某个文件夹的变化。
发现如果第一次监控一个实际没有的目录,它不会报错,
再添加一个新监控,还是一个实际没有的目录,就报错了,报一个jnotifyexception的错误,如下:
net.contentobjects.jnotify.win32.JNotifyException_win32: Error 2 : 系统找不到指定的文件。 : D:\xxx
请问这是jnotify的bug吗?
我是一个人吗?
能有解决的办法吗?
求大神指正
代码:
public class Test {
public static void main(String[] args) {
try {
int a = JNotify.addWatch("D:\\aaa",
JNotify.FILE_ANY,
true,
null);
System.out.println(a);
JNotify.removeWatch(a);
a = JNotify.addWatch("D:\\xxx",
JNotify.FILE_ANY,
true,
null);
System.out.println(a);
} catch (JNotifyException e) {
e.printStackTrace();
}
}
}
运行结果:
0
net.contentobjects.jnotify.win32.JNotifyException_win32: Error 2 : 系统找不到指定的文件。 : D:\xxx
at net.contentobjects.jnotify.win32.JNotify_win32.addWatch(Unknown Source)
at net.contentobjects.jnotify.win32.JNotifyAdapterWin32.addWatch(Unknown Source)
at net.contentobjects.jnotify.JNotify.addWatch(Unknown Source)
at test.jnotify.Test.main(Test.java:17)
------解决思路----------------------
监视文件变化
WatchService是Java 7中新添加的一个特性,用来监视一某个路径下的文件或者目录是否发生了变化。
final Path path = Paths.get(".");
final WatchService watchService = path.getFileSystem().newWatchService();
path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);
System.out.println("Report any file changed within next 1 minutes...");
注册了需要监视的目录后,需要使用WatchKey来得到一段时间内的,该目录的变化情况:
final WatchKey watchKey = watchService.poll(1, TimeUnit.MINUTES);
if(watchKey != null) {
watchKey.pollEvents().stream().forEach(event ->
System.out.println(event.context()));
}
这里使用了Java 8中的内部遍历器forEach来完成对于事件的遍历。这也算是一个Java 7和Java 8特性的联合使用吧。