Проверьте, когда все файловые дескрипторы выпущены в Java - PullRequest
1 голос
/ 27 декабря 2011

Я хочу отслеживать каталог, и когда там появляется файл, откройте его, обработайте, а затем переместите в другой каталог.Проблема в том, как проверить, что другая программа закончила писать.С Java 7 я могу использовать WatchService из FileSystem, но я могу проверять только когда файлы созданы.Я хочу знать, когда будут выпущены все файловые дескрипторы.

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

Какой предпочтительный способ сделать это в Java?Спасибо!

Ответы [ 2 ]

1 голос
/ 03 января 2012

Самый простой способ для файлового интерфейса:

  1. Отправитель записывает файлы с измененным именем файла (например, "example.xml _")
  2. Когда отправитель закончит запись файла, он переименует его (например, "example.xml_" в "example.xml")
  3. Приемник сканирует только для "* .xml"
1 голос
/ 27 декабря 2011

API Watcher в настоящее время позволяют вам видеть события, когда объект файловой системы создается, изменяется или удаляется в наблюдаемом каталоге. Они не говорят вам о других событиях inotify (в Linux). На самом деле, я не думаю, что есть способ сделать это на чистой Java.


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

В моем случае файлы создаются инструментами, которые сохраняют файлы изображений на общем диске. Решение состоит в том, чтобы наблюдать поток «измененных» событий для вновь созданного файла. Когда он останавливается и больше не ожидается в течение пары секунд («время установления»), файл может быть обработан.

Если это решение окажется ненадежным, резервным вариантом является реализация наблюдения и начальной обработки (создание снимка файла) в C / C ++ с использованием вызовов inotify напрямую. Это позволит мне непосредственно наблюдать событие закрытия файла.

...