我想知道如何在java中有效地实现文件系统更改?假设我在文件夹中有一个文件并修改该文件。我想尽快通过java通知这个变化(如果可能的话,不经常轮询)。
因为我认为我可以每隔几秒钟拨打一次java.io.file.lastModified,但我根本不喜欢那种解决方案的声音。
alfred@alfred-laptop:~/testje$ java -version
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Server VM (build 16.0-b13, mixed mode)
答案 0 :(得分:8)
查看执行此类监控的JNotify。
Java 7将为这类工作提供一些更高级的API(WatchService),这将消除对支持此操作的操作系统的轮询。
答案 1 :(得分:1)
我怀疑有一种纯粹的java方法可以做到这一点。操作系统提供API来监视文件系统的活动。您可能需要调用这些API。
答案 2 :(得分:1)
使用JNotify,你需要做的就是在buildpath中添加jnotify.jar并输入两个dll文件,即jnotify.dll jnotify_64bit.dll和jdk的lib里面。
是一个演示程序package jnotify;
import net.contentobjects.jnotify.JNotify;
import net.contentobjects.jnotify.JNotifyListener;
public class MyJNotify {
public void sample() throws Exception {
String path = "Any Folder location here which you want to monitor";
System.out.println(path);
int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED
| JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
boolean watchSubtree = true;
int watchID = JNotify
.addWatch(path, mask, watchSubtree, new Listener());
Thread.sleep(1000000);
boolean res = JNotify.removeWatch(watchID);
if (!res) {
System.out.println("Invalid");
}
}
class Listener implements JNotifyListener {
public void fileRenamed(int wd, String rootPath, String oldName,
String newName) {
print("renamed " + rootPath + " : " + oldName + " -> " + newName);
}
public void fileModified(int wd, String rootPath, String name) {
print("modified " + rootPath + " : " + name);
}
public void fileDeleted(int wd, String rootPath, String name) {
print("deleted " + rootPath + " : " + name);
}
public void fileCreated(int wd, String rootPath, String name) {
print("created " + rootPath + " : " + name);
}
void print(String msg) {
System.err.println(msg);
}
}
public static void main(String[] args) {
try {
new MyJNotify().sample();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案 3 :(得分:1)