web-dev-qa-db-fra.com

Quand est-ce que les Java temporaires sont supprimés?)

Supposons que je crée un fichier temporaire dans Java avec la méthode

File tmp = File.createTempFile(prefix, suffix);

Si je n’appelle pas explicitement la méthode delete(), quand le fichier sera-t-il supprimé?

En tant qu'intuition, cela peut se produire lorsque la machine virtuelle Java se termine, ou plus tôt (par le récupérateur de place), ou plus tard (par un processus de balayage du système d'exploitation).

76
Alphaaa

Le fichier ne sera pas supprimé automatiquement, à partir du JavaDoc :

Cette méthode fournit uniquement une partie d'une installation de fichier temporaire. Pour organiser la suppression automatique d'un fichier créé par cette méthode, utilisez la méthode deleteOnExit ().

Il faut donc appeler explicitement deleteOnExit () :

Demande que le fichier ou le répertoire désigné par ce chemin abstrait soit supprimé lorsque la machine virtuelle se termine.

80
Kai

Comme l’indique l’autre réponse, les fichiers temporaires créés avec File.createTempFile() seront pas automatiquement supprimés, à moins que vous ne le demandiez explicitement.

Pour ce faire, la méthode générique et portable consiste à appeler .deleteOnExit() sur l'objet File, ce qui planifiera la suppression du fichier à la fin de la JVM. Un léger inconvénient de cette méthode, cependant, est qu’elle ne fonctionne que si le VM se termine normalement; lors d’une terminaison anormale (c.-à-d. Un VM, arrêt brutal ou forcé du processus VM), le fichier peut rester non supprimé.

Sur les systèmes Unixish (tels que Linux), il est en fait possible d’obtenir une solution un peu plus fiable en supprimant le fichier temporaire immédiatement après l’avoir ouvert. Cela fonctionne parce que les systèmes de fichiers Unix permettent de supprimer un fichier ( non lié , pour être précis) alors qu'il est toujours maintenu ouvert par un ou plusieurs processus. Il est possible d’accéder normalement à ces fichiers via le descripteur de fichier ouvert et l’espace qu’ils occupent sur le disque ne sera récupéré par le système d’exploitation qu’après le dernier processus contenant un descripteur ouvert pour les sorties de fichiers.

Voici donc le moyen le plus fiable et le plus portable que je connaisse pour m'assurer qu'un fichier temporaire sera correctement supprimé après la fermeture du programme:

import Java.io.File;
import Java.io.RandomAccessFile;
import Java.io.IOException;

public class TempFileTest
{
    public static void main(String[] args)
    {
        try {
            // create a temp file
            File temp = File.createTempFile("tempfiletest", ".tmp"); 
            String path = temp.getAbsolutePath();
            System.err.println("Temp file created: " + path);

            // open a handle to it
            RandomAccessFile fh = new RandomAccessFile (temp, "rw");
            System.err.println("Temp file opened for random access.");

            // try to delete the file immediately
            boolean deleted = false;
            try {
                deleted = temp.delete();
            } catch (SecurityException e) {
                // ignore
            }

            // else delete the file when the program ends
            if (deleted) {
                System.err.println("Temp file deleted.");
            } else {
                temp.deleteOnExit();
                System.err.println("Temp file scheduled for deletion.");
            }

            try {
                // test writing data to the file
                String str = "A quick brown fox jumps over the lazy dog.";
                fh.writeUTF(str);
                System.err.println("Wrote: " + str);

                // test reading the data back from the file
                fh.seek(0);
                String out = fh.readUTF();
                System.err.println("Read: " + out);

            } finally {
                // close the file
                fh.close();
                System.err.println("Temp file closed.");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Sur un système Unixish, l’exécution de cette opération devrait produire le résultat suivant:

Temp file created: /tmp/tempfiletest587200103465311579.tmp
Temp file opened for random access.
Temp file deleted.
Wrote: A quick brown fox jumps over the lazy dog.
Read: A quick brown fox jumps over the lazy dog.
Temp file closed.

alors que sous Windows, la sortie est légèrement différente:

Temp file created: C:\DOCUME~1\User\LOCALS~1\Temp\tempfiletest5547070005699628548.tmp
Temp file opened for random access.
Temp file scheduled for deletion.
Wrote: A quick brown fox jumps over the lazy dog.
Read: A quick brown fox jumps over the lazy dog.
Temp file closed.

Dans les deux cas, toutefois, le fichier temporaire ne doit pas rester sur le disque une fois le programme terminé.


Ps. Lors du test de ce code sous Windows, j'ai constaté un fait assez surprenant: apparemment, il suffit de laisser - ne pas fermer le fichier temporaire pour conserver d'être supprimé. Bien entendu, cela signifie également que tout blocage survenant pendant l'utilisation du fichier temporaire entraîne sa suppression, ce qui est exactement ce que nous essayons de éviter ici.

D'après les informations dont je dispose, le seul moyen d'éviter cela est de s'assurer que le fichier temporaire toujours est fermé à l'aide d'un bloc finally. Bien sûr, vous pourriez aussi bien supprimer le fichier dans le même bloc finally. Je ne suis pas sûr que l'utilisation de .deleteOnExit() vous permette de gagner plus que cela.

50
Ilmari Karonen

Si je n’appelle pas explicitement la méthode delete(), quand le fichier sera-t-il supprimé?

Ce ne sera pas le cas, du moins pas avec Java. Si vous souhaitez que le fichier soit supprimé à la fin de la machine virtuelle, vous devez appeler tmp.deleteOnExit().

17
Ian Roberts

à partir de: Comment supprimer un fichier temporaire en Java

Le fichier temporaire est utilisé pour stocker les données moins importantes et temporaires qui doivent toujours être supprimées lorsque votre système est arrêté . La meilleure pratique consiste à utiliser File.deleteOnExit () pour le faire.

Par exemple,

File temp = File.createTempFile("abc", ".tmp"); 
temp.deleteOnExit();

L'exemple ci-dessus créera un fichier temporaire nommé “abc.tmp” et supprimez-le lorsque le programme est arrêté ou quitté.

Si vous voulez supprimer le fichier temporaire manuellement, vous pouvez toujours utiliser File.delete ().

4
Grijesh Chauhan

Le fichier temporaire est utilisé pour stocker les données moins importantes et temporaires, qui doivent toujours être supprimées lorsque votre système est arrêté. La meilleure pratique consiste à utiliser File.deleteOnExit () pour le faire.

Par exemple,

File temp = File.createTempFile("abc", ".tmp"); 
temp.deleteOnExit();

L'exemple ci-dessus crée un fichier temporaire nommé "abc.tmp" et le supprime lorsque le programme est arrêté ou quitté.

3
Juned Ahsan

Si vous le souhaitez, vous pouvez supprimer manuellement le fichier avant de mettre fin au processus. Toutefois, une fois le processus terminé, le fichier sera également supprimé.

0
Jasper Ketelaar