File.delete() возвращает false
Я создал файл из своего Java-программирования и регистрирую некоторые данные, используя API-протокол Apache Commons Logging, в частности реализацию Log4j.
После завершения ведения журнала я устанавливаю ссылку на класс Log как null. Когда я сейчас пытаюсь удалить файл, в который я вошел, File.delete() возвращает false.
Удаляя файл из проводника Windows во время отладки (в момент перед вызовом File.delete ()), я получаю уведомление "невозможно удалить: используется другой программой".
Нет открытых зависимостей на файл из моего кода (все потоки закрыты). Единственный объект, который может получить доступ к файлу, это объект Log, который я установил в null перед вызовом File.delete ()
Есть ли в любом случае, я вижу, какой конкретный объект содержит ссылку на ресурс файла? Есть ли другой способ заставить объект Log освободить ресурс, кроме установки его на ноль? Можно ли принудительно удалить файл?
2 ответа
Просто установка переменной в null не заставляет объект собирать мусор. Кроме того, есть вероятность, что он зарегистрирован на статической карте - вам нужно проверить реализацию, чтобы быть уверенным. (Я думаю, что некоторые версии используют слабые ссылки, но другие нет.)
Есть ли причина, по которой вы должны удалить файл прямо сейчас? Вы можете попробовать File.deleteOnExit()
, что может иметь больше шансов на удаление файла - хотя это зависит от того, на что точно рассчитано время. (Также остерегайтесь возможной утечки памяти, если вы звоните deleteOnExit
несколько раз.)
Не могли бы вы просто удалить файл после завершения приложения или, возможно, при следующем запуске?
В качестве альтернативы, вы можете использовать реализацию журнала, которая переворачивает файлы - попробуйте принудительно переворачивать, а затем удалить старый файл?
В вашем случае регистратор записывает его в файл - файл заблокирован другим процессом.
Обновления:
Проблема в том, что у app log4js есть блокировка записи в вашем файле. Таким образом, пока приложение не закрыто, вы не можете удалить файл. Решением может быть создание файлов меньшего размера или установка флага добавления на false, поэтому при перезапуске сервера старый файл журнала удаляется автоматически.
Попробуйте использовать
org.apache.log4j.LogManager.shutdown();
Завершая работу, убедитесь, что все процессы, использующие файлы журналов, завершены, и таким образом устранена проблема.
Обязательно позвоните close()
метод нашей собственной реализации Appender (который является подклассом AppenderSkeleton), так что он корректно закрывает appenders из getAllAppenders().