2016-01-08 5 views
3

У меня есть служба просмотра, наблюдающая за каталогом. После создания файлов я обрабатываю каталог и обновляю древовидную структуру.Java 7 Watch Service ENTRY_CREATE запускается до того, как файл написан

Это нормально работает на ENTRY_DELETE, но иногда (не всегда), когда происходит WatchEvent из ENTRY_CREATE, файл еще не записан на диск.

Я подтвердил это, создав new File() каталога, в котором зарегистрирована служба часов, а также путь к файлу и проверка метода exists(), поэтому кажется, что ОС запускает событие создания до того, как файл фактически создан.

This question похоже на ту же проблему, но с точки зрения папки.

В любом случае я могу обойти это?

+0

См [этот ответ] (http://stackoverflow.com/questions/22956262/java-watchservice-gets-informed-before-content-is-copied) - похож на тебя» страдают от одной и той же проблемы. – mindas

+0

Он делает - я оставлю это немного, если все-таки появятся лучшие решения. –

ответ

7

Событие запускается при создании файла. Файл должен быть создан до его записи. Файл не появляется сразу после его полной записи, он появляется после его создания.

Что вы можете сделать, это, как только вы получите событие создания:

  • Создать File объект, чтобы указать на файл
  • Создать java.nio.channels.FileChannel для произвольного доступа с использованием RandomAccessFile с режимом rw (так что читать & запись доступ)
  • Lock канал. Это будет блокировать, пока файл не является бесплатным для чтения/записи (чтение более общий Lock метод для получения дополнительной информации)
  • Когда замок приобретается, файл был выпущен в процессе, который написал файл

упрощенный пример:

File lockFile = new File("file_to_lock"); 
FileChannel channel = new RandomAccessFile(lockFile, "rw").getChannel(); 
channel.lock(); 
+0

Я могу только наградить щедрость за 20 часов, тогда я это сделаю. –

0

У меня была такая же проблема, я добавил несколько секунд задержки после создания события перед обработкой. Поскольку другое приложение используется для записи файла, а для его удаления используется несколько секунд, чтобы очистить содержимое и освободить файл.

+0

Проблема в том, что мне нужно, чтобы она была максимально восприимчивой, поэтому я ищу способ, которым я минимизирую задержку. –

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

  • Нет связанных вопросов^_^