Требование состоит в том, чтобы отслеживать несколько папок и файлов на предмет любых изменений в UNIX. Мне нужно иметь возможность перехватывать мой java-код для любых изменений, таких как создание/изменение/удаление. Может ли кто-нибудь предложить какие-либо фреймворки на основе Java, чтобы сделать то же самое?
Отслеживайте файлы/папки, чтобы получать уведомления об изменениях в UNIX
Ответы (3)
Если вы используете Java 7, вы можете использовать API WatchService. для отслеживания изменений в файловой системе.
Если вы застряли на Java 6-, вы можете взглянуть на некоторые альтернативы, предложенные в этом сообщение или этот другой.
Вы смотрели службу уведомлений о файлах в Java 7?
Пакет java.nio.file предоставляет API уведомления об изменении файла, который называется Watch Service API. Этот API позволяет зарегистрировать каталог (или каталоги) в службе наблюдения. При регистрации вы сообщаете сервису, какие типы событий вас интересуют: создание файла, удаление файла или модификация файла. Когда служба обнаруживает интересующее событие, оно перенаправляется в зарегистрированный процесс. Зарегистрированный процесс имеет поток (или пул потоков), предназначенный для наблюдения за любыми событиями, для которых он зарегистрирован. Когда приходит событие, оно обрабатывается по мере необходимости.
JNotify — это аналогичный сервис/библиотека для тех, кто не может использовать Java 7.
Java 7 представила WatchService
, который отслеживает зарегистрированные объекты на предмет изменений и событий.
Пример -
Path myDir = Paths.get("D:/test");
try {
WatchService watcher = myDir.getFileSystem().newWatchService();
myDir.register(watcher, StandardWatchEventKind.ENTRY_CREATE,
StandardWatchEventKind.ENTRY_DELETE, StandardWatchEventKind.ENTRY_MODIFY);
WatchKey watckKey = watcher.take();
List<WatchEvent<?>> events = watckKey.pollEvents();
for (WatchEvent event : events) {
if (event.kind() == StandardWatchEventKind.ENTRY_CREATE) {
System.out.println("Created: " + event.context().toString());
}
if (event.kind() == StandardWatchEventKind.ENTRY_DELETE) {
System.out.println("Delete: " + event.context().toString());
}
if (event.kind() == StandardWatchEventKind.ENTRY_MODIFY) {
System.out.println("Modify: " + event.context().toString());
}
}
} catch (Exception e) {
System.out.println("Error: " + e.toString());
}
}