2011-03-21 4 views
0

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

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

  1. Файл писатель, который пишет в файл X

  2. Файловая Бодрствующего (созданный с помощью JNotify), который смотрит файл X

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

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

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

ответ

1

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

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

+0

Файл блокировки кажется хорошей идеей. Однако, когда 1 создает файл блокировки, записывает и удаляет файл блокировки, иногда 2 не хватает времени. Поэтому прямо сейчас я использую 'Thread.sleep (1000)' перед удалением файла блокировки. Не очень элегантный. – Jus12

+0

Пока вы не можете управлять 3 при записи в файл, вы должны заблокировать файл при запуске 1. Если вы не можете заблокировать файл и не можете управлять 3 дальше, всегда будет вероятность состояния гонки между 1 + 3. – PeterMmm

0

Я попытался двумя различными способами (описаны ниже, вместе с параметром, который я выбрал)

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

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

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

Смежные вопросы