JNotify,一个支持动态监控文件和文件夹(支持级联监控)的架包。在linux系统中,调用的是linux底层的inotify服务,只是添加了对子文件夹级联监控的功能。在windows中,需要添加附件的dll文件,因为windows默认没有该服务。
使用很简单:
1,将jnotify包引入到工程中。
2,将jnotify依赖的so文件加入到java.library.path路径中。这个变量可能会有多个位置,随便将jnotify压缩包中附带的libjnotify.so文件加入到其中的任何一个路径中即可。如果不知道这个变量的值,可以使用System.getProperty("java.library.path")查看。当然,如果不想这么麻烦,可以在启动程序时指定JVM的参数
import net.contentobjects.jnotify.JNotify;
import net.contentobjects.jnotify.JNotifyException;
import net.contentobjects.jnotify.JNotifyListener;
/**
* 测试Jnotify监听文件目录变化
* @author yongbo.chen
*
*/
public class TestJnotify {
public static void main(String[] args) throws JNotifyException, InterruptedException {
// 调用监听方法
new TestJnotify().simple();
}
public void simple() throws JNotifyException, InterruptedException {
// 监听的目录
String path = System.getProperty("user.home");
int mask = JNotify.FILE_CREATED | JNotify.FILE_MODIFIED | JNotify.FILE_DELETED | JNotify.FILE_RENAMED;
// 是否监听子目录
boolean watchSubtree = true;
int watchId = JNotify.addWatch(path, mask, watchSubtree, new JNotifyListener() {
@Override
public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
System.out.println("重命名文件:" + rootPath + "/" + newName);
}
@Override
public void fileModified(int wd, String rootPath, String name) {
System.out.println("修改文件:" + rootPath + "/" + name);
}
@Override
public void fileDeleted(int wd, String rootPath, String name) {
System.out.println("删除文件:" + rootPath + "/" + name);
}
@Override
public void fileCreated(int wd, String rootPath, String name) {
System.out.println("创建文件:" + rootPath + "/" + name);
}
});
// 移除监听
Thread.sleep(10000);
JNotify.removeWatch(watchId);
}
}
JDK7 里面的 NIO 的WatchService,这个也可以实现监听。只要文件
发生变化,就会产生相应的事件