Подтвердить что ты не робот

Может ли метод Java File "canWrite()" поддерживать блокировку?

У меня есть приложение Java, которое контролирует папку для входящих файлов XML. Когда обнаружен новый файл, мне нужно проверить файл, который он не обновляет и не закрывается. Моя мысль - использовать File.canWrite(), чтобы проверить это. Есть ли проблема с этим? Это хороший способ проверить, что файл был полностью написан?

Другие идеи, которые я бросаю, следующие:

  • Разбор входящего XML файла и проверка что есть закрывающий тег.
  • Проверьте символ EoF.

Я просто не уверен, что любой из этих методов будет обрабатывать все сценарии.

4b9b3361

Ответ 1

Нет, canWrite не подходит для этой цели. В общем случае файл будет доступен для записи, даже если записывается другой процесс.

Для координации блокировки требуется протокол более высокого уровня. Если вы планируете использовать этот код на одной платформе, вы можете использовать средство NIO FileLock. Но внимательно прочитайте документацию и обратите внимание, что на многих платформах блокировка является только рекомендательной.

Другой подход заключается в том, чтобы один процесс записывал файл с именем, которое ваш процесс не распознает, а затем переименуйте файл в распознаваемое имя, когда запись будет завершена. На большинстве платформ операция переименования является атомарной, если источник и получатель - это тот же объем файловой системы. Изменение имени может использовать другое расширение файла или даже перемещение файла из одного каталога в другой (на том же томе).

Так как в этом случае вы работаете исключительно с XML, поиск тега close будет работать, но он не является надежным и, если есть комментарии после окончательной разметки или писатель или просто не пишет действительный XML

Поиск EOF не будет работать. Всегда будет EOF, даже когда писатель только что открыл файл и еще ничего не написал. Если бы это было не так, проще всего было бы позволить читателю начать синтаксический анализ, как только появится файл; он просто блокируется, пока автор не закроет файл. Но файловая система работает не так. Каждый файл имеет конец, даже если какой-то процесс в данный момент перемещает его.

Ответ 2

Кроме того, если вы делаете чек с последующей записью, то у вас есть условие гонки. Состояние может меняться между проверкой и записью. Иногда лучше всего попытаться сделать то, что вам нужно, и обработать ошибки изящно. возможно, механизм повторной попытки n-попытки с увеличенным временем задержки резервного копирования.

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

Другой вариант состоит в том, чтобы разделить код на два, у вас может быть другой поток - возможно, задача кварца - ответственный за перемещение готовых файлов в другой каталог, который обрабатывает ваш основной код.

Ответ 3

Одна вещь, которая, кажется, работает в Windows, - это - создать объект File(), представляющий данный файл (используя конструктор с полным именем файла) - Создайте второй идентичный File Object, таким же образом. - Попробуйте firstFile.renameTo(secondFile)

Это фиктивное упражнение по переименованию кажется успешным с файлами, которые не открыты для редактирования другим приложением (я тестировал его с помощью Word), но сбой, если они открыты.

И как имя nw filename = старое имя файла, он не создает никакой другой работы.

Ответ 4

Насколько я знаю, нет способа определить, имеет ли другой процесс в настоящее время открытый дескриптор файла из Java. Одним из вариантов является использование класса FileLock из нового io. Это не поддерживается на всех платформах, но если файлы локальны и процесс записи файла сотрудничает, это должно работать на любой платформе, поддерживающей блокировки.

Ответ 5

Если вы контролируете как читателя, так и писателя, тогда потенциальная технология блокировки должна заключаться в создании блокировки - которая обычно является атомной операцией - для чтения и продолжительности процесса записи. Если вы придерживаетесь такого подхода, вам необходимо управлять потенциальным сбоем процесса, в результате чего создается каталог "зависания".

Как упоминает Cheekysoft, файлы не являются атомарными и плохо подходят для блокировки.

Если вы не контролируете автора - например, если он создается демоном FTP, тогда ваши лучшие варианты будут использовать метод переименования или задержка для метода времени.