Имам клас 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
е събиран за боклук (в противен случай рискувам да напълня диска с ненужни изображения). Това трябва да се направи, докато приложението все още работи (за разлика от предложенията за почистване по време на прекратяване), поради факта, че е вероятно да работи за дълги периоди.
Не съм напълно запознат с концепцията GC на 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