java中Jnotify文件监视库的使用

时间:2024-04-01 08:19:36

jnotify-0.94 下载地址:http://download.csdn.net/detail/zxnlmj/7499157

本人测试环境为win7环境,使用Myeclipse

1、建一个java或者javaweb项目。。。

2、将jnotify-lib-0.94压缩包解压缩,添加其中的jnotify-0.94.jar到项目中(java项目需要手动build to path,javaweb不需要)。

3、建立测试类JnotifyTest.java如下:

[java] view plain copy
  1. <p>package cn.dyst.vmamcm.aftsrv.listener;</p><p>import net.contentobjects.jnotify.JNotify;  
  2. import net.contentobjects.jnotify.JNotifyAdapter;  
  3. import net.contentobjects.jnotify.JNotifyException;</p><p>/** 
  4.  *  
  5.  * @author zxn 
  6.  * 2014-08-10 
  7.  */  
  8. public class EnhancedJNotifyAdapter extends JNotifyAdapter {</p><p> private static final String REQUEST_BASE_PATH = "d:/jnotifyTest";</p><p> /** 被监视的目录 */  
  9.  String path = REQUEST_BASE_PATH;  
  10.  /** 关注目录的事件 */  
  11.  int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED  
  12.    | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;  
  13.  /** 是否监视子目录,即级联监视 */  
  14.  boolean watchSubtree = true;  
  15.  /** 监听程序Id */  
  16.  public int watchID;</p><p> public static void main(String[] args) {  
  17.   new EnhancedJNotifyAdapter().beginWatch();  
  18.  }</p><p> /** 
  19.   * 容器启动时启动监视程序 
  20.   *  
  21.   * @return 
  22.   */  
  23.  public void beginWatch() {  
  24.   /** 添加到监视队列中 */  
  25.   try {  
  26.    this.watchID = JNotify.addWatch(path, mask, watchSubtree, this);  
  27.    System.err.println("jnotify -----------启动成功-----------");  
  28.   } catch (JNotifyException e) {  
  29.    e.printStackTrace();  
  30.   }  
  31.   // 死循环,线程一直执行,休眠一分钟后继续执行,主要是为了让主线程一直执行  
  32.   // 休眠时间和监测文件发生的效率无关(就是说不是监视目录文件改变一分钟后才监测到,监测几乎是实时的,调用本地系统库)  
  33.   while (true) {  
  34.    try {  
  35.     Thread.sleep(60000);  
  36.    } catch (InterruptedException e) {// ignore it  
  37.    }  
  38.   }  
  39.  }</p><p> /** 
  40.   * 当监听目录下一旦有新的文件被创建,则即触发该事件 
  41.   *  
  42.   * @param wd 
  43.   *            监听线程id 
  44.   * @param rootPath 
  45.   *            监听目录 
  46.   * @param name 
  47.   *            文件名称 
  48.   */  
  49.  public void fileCreated(int wd, String rootPath, String name) {  
  50.   System.err.println("fileCreated, the created file path is " + rootPath + "/" + name);  
  51.  }</p><p> public void fileRenamed(int wd, String rootPath, String oldName,  
  52.    String newName) {  
  53.   System.err.println("fileRenamed, the old file path is " + rootPath + "/" + oldName + ", and the new file path is " + rootPath + "/" + newName);  
  54.  }</p><p> public void fileModified(int wd, String rootPath, String name) {  
  55.   System.err.println("fileModified, the modified file path is " + rootPath + "/" + name);  
  56.  }</p><p> public void fileDeleted(int wd, String rootPath, String name) {  
  57.   System.err.println("fileDeleted , the deleted file path is " + rootPath + name);  
  58.  }  
  59. }</p>  

运行main方法,可能会报错如下:

[html] view plain copy
  1. java.lang.UnsatisfiedLinkError: no jnotify in java.library.path   
  2.     at java.lang.ClassLoader.loadLibrary(Unknown Source)   
  3.     at java.lang.Runtime.loadLibrary0(Unknown Source)   
  4.     at java.lang.System.loadLibrary(Unknown Source)   
  5.     at net.contentobjects.jnotify.win32.JNotify_win32.<clinit>(Unknown Source)   
  6.     at net.contentobjects.jnotify.win32.JNotifyAdapterWin32.<init>(Unknown Source)   

 

[html] view plain copy
  1. Error loading library,   
  2. java.library.path=C:\Program Files (x86)\Java\jdk1.6.0_30\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;  
  3. C:\Windows;C:/Program Files (x86)/MyEclipse8.6/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin/client;  
  4. C:/Program Files (x86)/MyEclipse8.6/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin;C:\oracle\product\10.2.0\db_1\bin;  
  5. C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;  
  6. C:\Program Files (x86)\Java\jdk1.6.0_30\bin;D:\ProBag\apache-cxf-2.7.7\bin;.  

这是因为没有将jnotify运行时需要加载响应的类库(上面下载的压缩包中,类库的名称不能随意改变):

电脑处理器为i386(intel32位处理器)架构:jnotify.dll

电脑处理器为amd64架构:jnotify_64bit.dll

这就需要将类库放到System.err.println(System.getProperty("java.library.path"));该代码执行所输出的java类库路径的任意一个目录下,我是放到C:\Program Files (x86)\Java\jdk1.6.0_30\bin该目录下。

4、再次运行,成功。

5、对文件各个操作触发次数测试:

a、对文件做删除操作,触发结果如下图:

java中Jnotify文件监视库的使用

 

b、对空文件(0kb)做拷贝粘贴操作到被监视目录,触发结果如下图:

java中Jnotify文件监视库的使用

可见,触发一次create,一次modified。

c、对非空文件进行拷贝粘贴到被监视目录操作:

java中Jnotify文件监视库的使用

 

触发一次create,两次modifiedm,即先新建空文件(触发一次create) ,另外往文件中写内容,触发两次modified(一次在开始写文件内容之前,一次在文件内容写完毕之后)。

d、新建非空文件:

java中Jnotify文件监视库的使用

触发一次create,一次modifiled。

e、新建空文件:

java中Jnotify文件监视库的使用

仅仅触发一次create。

f、重命名操作:

java中Jnotify文件监视库的使用

触发一次renamed操作,与modified操作。

 

对以上可总结,得表格如下:

  create modified renamed deleted

新建空文件

                               

1

                    

0 0 0
新建非空文件 1 1 0 0
拷贝粘贴空文件 1 1 0 0
拷贝粘贴非空文件 1 2 0 0
重命名 0 1 1 0
删除 0 0 0 1

结论:1、无论是新建还是拷贝粘贴文件,非空文件操作比空文件操作多出发modified一次。