如果在Java中存在触发器(即某些事件,如新文件添加到目录),我想运行任务。 Java是否内置了对此的支持? 如果没有,我可以用什么第三方图书馆来促进这个?
答案 0 :(得分:1)
在Java 7中,Watch Service允许在文件或目录上检测到更改或事件时执行任务。
教程:http://docs.oracle.com/javase/tutorial/essential/io/notification.html#overview
API文档:http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html
这是我做过的一个简单示例:
package watcher;
import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
public class Watcher {
private final FileCreatedAction action;
private final String pathToWatchString;
public Watcher(FileCreatedAction action, String pathToWatchString) {
this.action = action;
this.pathToWatchString = pathToWatchString;
}
public void start() throws IOException {
FileSystem defaultFileSystem = FileSystems.getDefault();
WatchService watchService = defaultFileSystem.newWatchService();
Path pathToWatch = defaultFileSystem.getPath(pathToWatchString);
pathToWatch.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
while(true) {
try {
WatchKey key = watchService.take();
if (key != null) {
for (WatchEvent<?> event: key.pollEvents()) {
if (event.kind().equals(StandardWatchEventKinds.ENTRY_CREATE))
{
WatchEvent<Path> ev = (WatchEvent<Path>)event;
Path filename = ev.context();
Path fullFilename = pathToWatch.resolve(filename);
action.performAction(fullFilename);
}
}
}
} catch (InterruptedException error) {
return;
}
}
}
public static void main(String[] args) throws IOException {
FileCreatedAction action = new FileCreatedAction() {
@Override
public void performAction(Path fullPath) {
System.out.printf("Found file %s", fullPath);
}
};
Watcher watcher = new Watcher(action, "/foo");
watcher.start();
}
}
interface FileCreatedAction {
void performAction(Path fullPath);
}
答案 1 :(得分:0)
您可以轻松实现自己的文件系统跟踪器。 这里有一个很好的工作示例:
答案 2 :(得分:0)
通常,您需要的是名为“Observer Pattern”的设计模式。您可以实现自己的,无需任何内置支持或外部框架。
对于内置支持,请检查Java的'util'包中的“观察者”和 EventListener (自Java 7开始)接口。
另外,请检查以下链接: