J'ai un ImageWrapper
classe qui enregistre les images dans des fichiers temporaires sur le disque afin de libérer la mémoire du tas, et qui permet de les recharger en cas de besoin.
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.
}
}
Mon problème est de savoir comment s'assurer que les fichiers sont supprimés lorsqu'une telle ImageWrapper
L'instance de l'utilisateur est récupérée (sinon je risque de remplir le disque avec des images inutiles). Ce site doit être effectuée pendant que l'application est encore en cours d'exécution (par opposition aux suggestions de nettoyage en cours d'exécution), car elle est susceptible de fonctionner pendant de longues périodes.
Je ne suis pas totalement familier avec le concept GC de Java, et je me demandais si finalize()
est ce que je recherche. Mon idée était d'appeler delete() (sur un Thread séparé, d'ailleurs) à partir d'une commande overriden finalize()
méthode. Est-ce la bonne façon de procéder ?
UPDATE :
Je ne pense pas que je puisse close()
l'objet, comme l'ont suggéré de nombreux utilisateurs, car chacune de ces images est récupérée par une liste de récepteurs que je ne contrôle pas et qui peuvent enregistrer une référence à l'objet. Le seul moment où je suis certain de pouvoir supprimer le fichier est lorsqu'aucune référence n'est conservée, c'est pourquoi j'ai pensé que finalize()
est le bon chemin. Des suggestions ?
UPDATE 2 :
Quels sont les scénarios où finalize()
ne seront pas appelés ? Si les seules possibilités sont de quitter le programme (d'une manière attendue/imprévue), je peux le supporter, car cela signifie que je risque de ne supprimer qu'un seul fichier temporaire inutile (celui qui a été traité lors de la sortie).