У меня есть класс ImageWrapper
, который сохраняет изображения во временные файлы на диске, чтобы освободить память кучи, и позволяет перезагружать их при необходимости.
class ImageWrapper {
File tempFile;
public ImageWrapper(BufferedImage img) {
// save image to tempFile and gc()
}
public BufferedImage getImage() {
// read the image from tempFile and return it.
}
public void delete() {
// delete image from disk.
}
}
Меня беспокоит, как убедиться, что файлы удаляются, когда такой экземпляр ImageWrapper
собирает мусор (иначе я рискую заполнить диск ненужными изображениями). Это необходимо выполнять во время работы приложения (в отличие от рекомендаций по очистке во время завершения работы), так как оно может работать в течение длительного времени.
Я не полностью знаком с концепцией сборки мусора в Java, и мне было интересно, является ли finalize()
тем, что я ищу. Моя идея состояла в том, чтобы вызвать delete() (в отдельном потоке, если это имеет значение) из переопределенного метода finalize()
. Это правильный способ сделать это?
ОБНОВИТЬ:
Я не думаю, что смогу close()
объект, как предлагают многие пользователи, из-за того, что каждое такое изображение извлекается в список слушателей, которых я не контролирую, и может сохранить ссылку на объект. единственный раз, когда я уверен, что смогу удалить файл, - это когда нет ссылок, поэтому я подумал, что finalize()
- правильный путь. Какие-либо предложения?
ОБНОВЛЕНИЕ 2:
Каковы сценарии, в которых finalize()
не будет вызываться? Если единственные возможности - выход из программы (ожидаемым/неожиданным образом), я могу это сделать, потому что это означает, что я рискую только одним ненужным временным файлом, оставшимся не удаленным (тот, который был обработан во время выхода).
finalize
; это действительно не дает вам ничего из того, что уже упоминалось в ответах ниже, и имеет свой собственный набор головных болей. Самым простым решением было бы иметь отдельный каталог в каталогеTMP
для вашего приложения. Когда ваше приложение запустится, очистите этот каталог. Это потребуется только в том случае, если ваша JVM вымирает нечистым образом. Во всех остальных случаях (JVM нормально завершает работу)deleteOnExit
должно работать нормально. - person Sanjay T. Sharma   schedule 04.08.2013PhantomReference
, как указано в некоторых ответах ниже. - person Sanjay T. Sharma   schedule 04.08.2013