Java - Как обнаружить удаление файла при записи в файл? - PullRequest
11 голосов
/ 23 июня 2011

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

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

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

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

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

Ответы [ 4 ]

1 голос
/ 23 июня 2011

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

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

1 голос
/ 23 июня 2011

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

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

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

1 голос
/ 23 июня 2011
0 голосов
/ 23 июня 2011
  1. В Unix, Linux, Solaris, MacOS, HP / UX, AIX и т. Д. Невозможно определить, что открытый файл был удален.

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

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

...