Игнорировать изменение файла с помощью Jnotify

Я использую Jnotify, чтобы написать приложение. (JNotify - это библиотека для обнаружения изменений файла.)

Приложение имеет следующие компоненты:

  1. Средство записи файлов, которое пишет в файл X

  2. Средство просмотра файлов (созданное с помощью JNotify), которое просматривает файл X

  3. Внешнее приложение (например, блокнот), которое записывает в файл X по требованию пользователя.

Я хочу, чтобы JNotify запускал уведомления только тогда, когда X был изменен с помощью 3, и игнорировал, когда изменялся с помощью 1. (или, по крайней мере, различал модификации с помощью 1 и 3).

Есть ли простой способ, которым я могу это сделать? Один из способов заключается в том, чтобы иметь синхронизированную переменную, которая переключается, когда средство записи файлов пишет в нее, но я чувствую, что это не очень элегантно.

2 ответа

Решение

В любом случае вам нужно некоторое общение между 1 + 2, чтобы временно отключить 2 (а для 3 у вас нет возможности сделать это). Если 1 + 2 работает в одной и той же JVM, конечно, более подходящим способом является разделение некоторого состояния в общей переменной.

Вы можете подумать о других умных способах общения. Мне пришло в голову: перед тем, как 1 начнет писать, он сгенерирует файл блокировки, на котором также находится 2. Когда файл блокировки удаляется с 1 после завершения записи, 2 может продолжить прослушивание файла после уведомления об удалении файла блокировки.

Я пробовал два разных способа (описано ниже, вместе с выбранным вариантом)

  • Вариант 1: использовать общую логическую переменную (т. Е. Блокировку), которая переключается в true на 1. Когда эта переменная равна true, 3 не записывает, а вместо этого устанавливает ее в false).

  • Вариант 2: использовать общий SHA1-хеш файла. Writer (1) обновляет хэш каждый раз, когда записывает файл. Затем watcher (2) проверяет хеш измененного файла и игнорирует, совпадает ли хеш с общим хешем.

Я решил использовать Вариант 2, так как он работал отлично. Использовать опцию 1 сложно, поскольку для каждого измененного файла JNotify запускает два обновления (странно).

Другие вопросы по тегам