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
- <p>package cn.dyst.vmamcm.aftsrv.listener;</p><p>import net.contentobjects.jnotify.JNotify;
- import net.contentobjects.jnotify.JNotifyAdapter;
- import net.contentobjects.jnotify.JNotifyException;</p><p>
- public class EnhancedJNotifyAdapter extends JNotifyAdapter {</p><p> private static final String REQUEST_BASE_PATH = "d:/jnotifyTest";</p><p>
- String path = REQUEST_BASE_PATH;
- int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED
- | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
- boolean watchSubtree = true;
- public int watchID;</p><p> public static void main(String[] args) {
- new EnhancedJNotifyAdapter().beginWatch();
- }</p><p>
- public void beginWatch() {
- try {
- this.watchID = JNotify.addWatch(path, mask, watchSubtree, this);
- System.err.println("jnotify -----------啟動成功-----------");
- } catch (JNotifyException e) {
- e.printStackTrace();
- }
- // 死循環,線程一直執行,休眠一分鐘後繼續執行,主要是為了讓主線程一直執行
- // 休眠時間和監測檔案發生的效率無關(就是說不是監視目錄檔案改變一分鐘後才監測到,監測幾乎是實時的,調用本地系統庫)
- while (true) {
- try {
- Thread.sleep(60000);
- } catch (InterruptedException e) {// ignore it
- }
- }
- }</p><p>
- public void fileCreated(int wd, String rootPath, String name) {
- System.err.println("fileCreated, the created file path is " + rootPath + "/" + name);
- }</p><p> public void fileRenamed(int wd, String rootPath, String oldName,
- String newName) {
- System.err.println("fileRenamed, the old file path is " + rootPath + "/" + oldName + ", and the new file path is " + rootPath + "/" + newName);
- }</p><p> public void fileModified(int wd, String rootPath, String name) {
- System.err.println("fileModified, the modified file path is " + rootPath + "/" + name);
- }</p><p> public void fileDeleted(int wd, String rootPath, String name) {
- System.err.println("fileDeleted , the deleted file path is " + rootPath + name);
- }
- }</p>
運作main方法,可能會報錯如下:
[html] view plain copy
- java.lang.UnsatisfiedLinkError: no jnotify in java.library.path
- at java.lang.ClassLoader.loadLibrary(Unknown Source)
- at java.lang.Runtime.loadLibrary0(Unknown Source)
- at java.lang.System.loadLibrary(Unknown Source)
- at net.contentobjects.jnotify.win32.JNotify_win32.<clinit>(Unknown Source)
- at net.contentobjects.jnotify.win32.JNotifyAdapterWin32.<init>(Unknown Source)
[html] view plain copy
- Error loading library,
- java.library.path=C:\Program Files (x86)\Java\jdk1.6.0_30\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;
- C:\Windows;C:/Program Files (x86)/MyEclipse8.6/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin/client;
- 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;
- C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;
- 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、對檔案做删除操作,觸發結果如下圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiN0UDM1YDMzIDMxgDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
b、對空檔案(0kb)做拷貝粘貼操作到被監視目錄,觸發結果如下圖:
可見,觸發一次create,一次modified。
c、對非空檔案進行拷貝粘貼到被監視目錄操作:
觸發一次create,兩次modifiedm,即先建立空檔案(觸發一次create) ,另外往檔案中寫内容,觸發兩次modified(一次在開始寫檔案内容之前,一次在檔案内容寫完畢之後)。
d、建立非空檔案:
觸發一次create,一次modifiled。
e、建立空檔案:
僅僅觸發一次create。
f、重命名操作:
觸發一次renamed操作,與modified操作。
對以上可總結,得表格如下:
create | modified | renamed | deleted |
建立空檔案 | 1 | ||
建立非空檔案 | 1 | 1 | |
拷貝粘貼空檔案 | 1 | 1 | |
拷貝粘貼非空檔案 | 1 | 2 | |
重命名 | 1 | 1 | |
删除 | 1 |
結論:1、無論是建立還是拷貝粘貼檔案,非空檔案操作比空檔案操作多出發modified一次。