it-swarm.com.de

Wann werden Java temporäre Dateien gelöscht?

Angenommen, ich erstelle eine temporäre Datei in Java mit der Methode

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

Wenn ich die delete() -Methode nicht explizit aufrufe, wann wird die Datei gelöscht?

Als eine Intuition könnte es sein, wenn die JVM beendet wird oder früher (vom Garbage Collector) oder später (von einem Betriebssystem-Sweeping-Prozess).

76
Alphaaa

Die Datei wird nicht automatisch aus dem JavaDoc gelöscht:

Diese Methode bietet nur einen Teil einer Funktion für temporäre Dateien. Verwenden Sie die Methode deleteOnExit (), um das automatische Löschen einer mit dieser Methode erstellten Datei zu veranlassen.

Sie müssen also explizit deleteOnExit () aufrufen:

Fordert an, dass die durch diesen abstrakten Pfadnamen angegebene Datei oder das Verzeichnis gelöscht wird, wenn die virtuelle Maschine beendet wird.

80
Kai

Wie die anderen Antworten bemerken, werden temporäre Dateien, die mit File.createTempFile() erstellt wurden, nicht ​​automatisch gelöscht, es sei denn, Sie fordern dies ausdrücklich an.

Die übliche, portable Methode hierfür ist der Aufruf von .deleteOnExit() für das Objekt File, das das Löschen der Datei plant, wenn die JVM beendet wird. Ein kleiner Nachteil dieser Methode ist jedoch, dass sie nur funktioniert, wenn VM normal beendet wird; bei einer abnormalen Beendigung (dh einem VM Absturz oder erzwungener Beendigung)) Beim Prozess VM) bleibt die Datei möglicherweise nicht gelöscht.

Auf Unixish-Systemen (wie Linux) ist es tatsächlich möglich, eine etwas zuverlässigere Lösung zu erhalten, indem die temporäre Datei gelöscht wird nmittelbar nach dem Öffnen. Dies funktioniert, weil Unix-Dateisysteme das Löschen einer Datei ermöglichen ( nlinked , um genau zu sein), während sie noch von einem oder mehreren Prozessen geöffnet ist. Auf solche Dateien kann normalerweise über das geöffnete Dateihandle zugegriffen werden, und der Speicherplatz, den sie auf der Festplatte belegen, wird vom Betriebssystem erst zurückgefordert, nachdem der letzte Vorgang ein offenes Handle für die Datei beendet hat.

Hier ist die zuverlässigste und portabelste Methode, die ich kenne, um sicherzustellen, dass eine temporäre Datei nach dem Beenden des Programms ordnungsgemäß gelöscht wird:

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();
        }
    }
}

Auf einem Unixish-System sollte dies ungefähr die folgende Ausgabe erzeugen:

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.

während unter Windows die Ausgabe etwas anders aussieht:

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.

In beiden Fällen sollte die temporäre Datei jedoch nicht auf der Festplatte verbleiben, nachdem das Programm beendet wurde.


Ps. Beim Testen dieses Codes unter Windows habe ich eine ziemlich überraschende Tatsache festgestellt: Anscheinend reicht es aus, nur die temporäre Datei nicht zu schließen, um sie beizubehalten es wird gelöscht. Dies bedeutet natürlich auch, dass jeder Absturz, der während der Verwendung der temporären Datei auftritt, dazu führt, dass diese nicht gelöscht wird. Genau das versuchen wir hier vermeiden.

AFAIK, die einzige Möglichkeit, dies zu vermeiden, besteht darin, sicherzustellen, dass die temporäre Datei always mit einem finally -Block geschlossen wird. Dann können Sie natürlich auch die Datei im selben finally -Block löschen. Ich bin mir nicht sicher, ob die Verwendung von .deleteOnExit() Sie tatsächlich davon überzeugen würde.

50
Ilmari Karonen

Wenn ich die delete() -Methode nicht explizit aufrufe, wann wird die Datei gelöscht?

Zumindest nicht von Java. Wenn die Datei beim Beenden der JVM gelöscht werden soll, müssen Sie tmp.deleteOnExit() aufrufen.

17
Ian Roberts

from: So löschen Sie eine temporäre Datei in Java

Temporäre Datei dient zum Speichern der weniger wichtigen und temporären Daten , die immer gelöscht werden sollten, wenn Ihr System beendet wird . Am besten verwenden Sie dazu File.deleteOnExit ().

Beispielsweise,

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

Das obige Beispiel erstellt eine temporäre Datei mit dem Namen "abc.tmp" und löscht sie, wenn das Programm beendet oder beendet wird.

Wenn Sie die temporäre Datei manuell löschen möchten, können Sie weiterhin File.delete () verwenden.

4
Grijesh Chauhan

Temporäre Datei wird zum Speichern der weniger wichtigen und temporären Daten verwendet, die immer gelöscht werden sollten, wenn Ihr System beendet wird. Am besten verwenden Sie dazu File.deleteOnExit ().

Beispielsweise,

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

Das obige Beispiel erstellt eine temporäre Datei mit dem Namen "abc.tmp" und löscht sie, wenn das Programm beendet oder beendet wird.

3
Juned Ahsan

Sie können die Datei vor dem Beenden des Vorgangs manuell löschen, wenn Sie möchten. Wenn der Vorgang jedoch beendet wird, wird die Datei ebenfalls gelöscht.

0
Jasper Ketelaar