我試圖評估當前需要攔截給定目錄及其子目錄中的文件更改的需求。適合我需求的幾個工具是jpathwatch和jnotify。 jpathwatch的工作原理,但不支持遞歸目錄監視。 Jnotify似乎很好地解決了這個限制。對新文件jNotify的奇怪行爲
在評估jnotify時,我觀察到一個奇怪的行爲。這在Linux和Windows中都是一致的。讓我試着用一個例子來解釋。我有以下目錄結構:
C:
|--> Temp |
| --> File |
| --> Dir |
| --> SubDir
jNotify配置爲偵聽C:/ Temp/File。現在,如果我在「Dir」或「SubDir」文件夾下放置文件,它將捕獲新創建的事件。但是,在同一時間,提出了三個文件修改事件。當我在「SubDir」文件夾中添加一個新文件Extraction.log時,輸出如下。
created C:/Temp/File/Dir/SubDir/Extraction.log
modified C:/Temp/File/Dir/SubDir/Extraction.log
modified C:/Temp/File/Dir/SubDir/Extraction.log
modified C:/Temp/File/Dir/SubDir/Extraction.log
正如你所看到的,文件修改有3個事件。該應用程序沒有任何方法來確定其修改或新文件創建。所以,它會處理相同的文件四次。
我使用JNotify網站中顯示的示例代碼。
package com.test.io;
import net.contentobjects.jnotify.JNotify;
public class JNotifyTest {
/**
* @param args
*/
public static void main(String[] args) {
JNotifyTest jNotify = new JNotifyTest();
try {
jNotify.sample();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void sample() throws Exception {
// path to watch
String path = "C:\\Temp\\File\\";
// watch mask, specify events you care about,
// or JNotify.FILE_ANY for all events.
int mask = JNotify.FILE_CREATED |
JNotify.FILE_DELETED |
JNotify.FILE_MODIFIED |
JNotify.FILE_RENAMED;
// watch subtree?
boolean watchSubtree = true;
// add actual watch
int watchID = JNotify.addWatch(path, mask, watchSubtree, new Listener());
// sleep a little, the application will exit if you
// don't (watching is asynchronous), depending on your
// application, this may not be required
Thread.sleep(1000000);
// to remove watch the watch
boolean res = JNotify.removeWatch(watchID);
if (!res) {
// invalid watch ID specified.
}
}
class Listener implements JNotifyListener {
public void fileRenamed(int wd, String rootPath, String oldName,
String newName) {
System.out.println("renamed " + rootPath + oldName + " -> " + newName);
}
public void fileModified(int wd, String rootPath, String name) {
System.out.println("modified " + rootPath + name);
}
public void fileDeleted(int wd, String rootPath, String name) {
System.out.println("deleted " + rootPath + name);
}
public void fileCreated(int wd, String rootPath, String name) {
System.out.println("created " + rootPath + name);
}
}
}
不幸的是,我不能使用jdk 1.7,因爲我們被困在1.6中。
我見過很多與jNotify相關的帖子,如果有人可以提供指針或任何其他解決方案來解決這個需求,我會非常感激。
感謝
感謝您的回覆。正如你所提到的,它可能是一個操作系統的問題,它引發了文件創建或修改的多個事件。但是,我不確定你提出的緩衝解決方案將如何工作,特別是當連續處理多個文件時。 – Shamik