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

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

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

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

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

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


person Yatendra    schedule 23.06.2011    source источник
comment
Это винда или юникс? Вы закрываете файл после каждой записи или оставляете его открытым все время, пока работаете?   -  person Gabe    schedule 23.06.2011
comment
@ Гейб Это Unix. В Windows вы не можете удалить файл, если он используется каким-то процессом.   -  person Yatendra    schedule 23.06.2011
comment
В Unix нет способа узнать, что файл, который вы открыли, был удален, поэтому Java (или любой другой язык) не может генерировать исключение, когда это происходит.   -  person Gabe    schedule 23.06.2011
comment
Может быть, лучше записать данные в базу данных?   -  person splash    schedule 23.06.2011


Ответы (4)


FileChannel и < могут быть полезны классы href="http://download.oracle.com/javase/1.4.2/docs/api/java/nio/channels/FileLock.html" rel="nofollow noreferrer">FileLock. в этом случае.

см. Как я могу заблокировать файл с помощью java (если возможно)

person splash    schedule 23.06.2011
comment
Блокировка, как вы описываете, каким-либо образом предотвращает удаление заблокированного файла? - person Gabe; 23.06.2011
comment
@Gabe: Похоже, что блокировка в Unix/Linux носит только рекомендательный характер и не препятствует удалению файла из других процессов. - person splash; 23.06.2011
comment
Иногда блокировка является обязательной (на самом деле вы не можете использовать заблокированную часть файла), но даже в этом случае я не думаю, что это мешает вам удалить заблокированный файл. - person Gabe; 23.06.2011

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

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

person Peter Lawrey    schedule 23.06.2011

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

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

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

person peshkira    schedule 23.06.2011

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

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

Так что на ваш вопрос нет очевидного ответа.

person user207421    schedule 23.06.2011