Java 原生并不直接支持 inotify,因為 inotify 是 Linux 特有的文件系統監控機制。但是,你可以通過 Java 的 Native Interface (JNI) 來調用 C/C++ 代碼,從而使用 inotify。
以下是一個簡單的示例,展示了如何使用 JNI 在 Java 中集成 inotify:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/inotify.h>
#include <unistd.h>
#define EVENT_SIZE ( sizeof (struct inotify_event) )
#define BUF_LEN ( 1024 * ( EVENT_SIZE + 16 ) )
void monitor_directory(const char *path) {
int length, i = 0;
int fd = inotify_init();
if (fd < 0) {
perror("inotify_init");
return;
}
int wd = inotify_add_watch(fd, path, IN_MODIFY | IN_CREATE | IN_DELETE);
if (wd < 0) {
perror("inotify_add_watch");
close(fd);
return;
}
char buffer[BUF_LEN];
while (1) {
length = read(fd, buffer, BUF_LEN);
if (length < 0) {
perror("read");
break;
}
while (i < length) {
struct inotify_event *event = (struct inotify_event *)&buffer[i];
if (event->len) {
if (event->mask & IN_MODIFY) {
printf("Modified file: %s\n", event->name);
} else if (event->mask & IN_CREATE) {
printf("Created file: %s\n", event->name);
} else if (event->mask & IN_DELETE) {
printf("Deleted file: %s\n", event->name);
}
}
i += EVENT_SIZE + event->len;
}
i = 0;
}
inotify_rm_watch(fd, wd);
close(fd);
}
int main() {
const char *path = "/path/to/monitor";
monitor_directory(path);
return 0;
}
javac
編譯這個 C 文件,并使用 javah
生成對應的 JNI 頭文件:gcc -shared -o libinotify.so monitor.c -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux
javah -jni Monitor
monitor_directory
函數:public class Monitor {
static {
System.loadLibrary("inotify");
}
public native void monitorDirectory(String path);
public static void main(String[] args) {
Monitor monitor = new Monitor();
monitor.monitorDirectory("/path/to/monitor");
}
}
javac Monitor.java
java Monitor
這樣,你就可以在 Java 中使用 inotify 進行文件系統監控了。請注意,這個示例僅用于演示目的,實際應用中可能需要考慮更多的錯誤處理和性能優化。