Java. Как определить удаление файла во время записи в файл?

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

Я обнаружил, что java не генерирует никаких исключений, когда он пытается записать файл, который был удален.

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

Метод II - Проверяйте наличие файла каждый раз перед записью в файл. Это также не очень хороший подход, поскольку проверка существования файла является более дорогостоящей операцией.

Метод III - Расширить java.io.FilterWriter (который мы используем для записи в файл) и переопределить метод write() бросать исключение всякий раз, когда он пытается записать файл, который был удален. Это кажется хорошим решением, но я не мог найти места, где Java переваривает какое-то исключение (когда он пытается записать в удаленный файл), который мы можем бросить, переопределив этот метод.

Ответ 2

В Unix есть файлы и есть каталоги. Файл может отображаться в любом количестве каталогов, как вам нравится, и открытый файл может быть на диске, но не отображается в любом каталоге. Если файл удаляется из каталога, который является изменением каталога, а не файла.

Чтобы определить, был ли каталог изменен, вам необходимо опросить его путь с помощью File.exists(). В Java 7 есть Хранитель каталогов, который может избежать необходимости опроса.

Ответ 3

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

Взгляните на пакет мониторинга файлов apache commons: http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/monitor/package-summary.html В принципе, вы можете регистрировать слушателей для разных событий (удаление файла, удаление каталога и т.д.) И слушателя.

Если вы хотите предотвратить удаление, я рассмотрю комментарий @splash. Другим вариантом является запись в скрытый файл в вашем временном каталоге.

Ответ 4

  • В Unix, Linux, Solaris, MacOS, HP/UX, AIX и т.д. нет возможности обнаружить, что открытый файл был удален.

  • В Windows невозможно удалить открытый файл.

Таким образом, ваш вопрос не имеет явного ответа.