Angenommen, ich erstelle mit der Methode eine temporäre Datei in Java
File tmp = File.createTempFile(prefix, suffix);
Wenn ich die delete()
Methode nicht explizit aufrufe , wann wird die Datei gelöscht?
Als Intuition kann es sein, dass die JVM beendet wird oder früher (durch den Garbage Collector) oder später (durch einen Betriebssystem-Sweeping-Prozess).
java
garbage-collection
temporary-files
Alphaaa
quelle
quelle
Antworten:
Die Datei wird nicht automatisch aus dem JavaDoc gelöscht :
Sie müssen also explizit deleteOnExit () aufrufen :
quelle
Wie in den anderen Antworten vermerkt, werden temporäre Dateien, mit denen erstellt wurde
File.createTempFile()
, nicht automatisch gelöscht, es sei denn, Sie fordern dies ausdrücklich an.Die generische, tragbare Methode hierfür besteht darin,
.deleteOnExit()
dasFile
Objekt aufzurufen , das das Löschen der Datei beim Beenden der JVM plant. Ein kleiner Nachteil dieser Methode ist jedoch, dass sie nur funktioniert, wenn die VM normal beendet wird. Bei einer abnormalen Beendigung (dh einem VM-Absturz oder einer erzwungenen Beendigung des VM-Prozesses) 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 unmittelbar nach dem Öffnen gelöscht wird . Dies funktioniert , weil Unix - Dateisysteme erlauben eine Datei (gelöscht werden nicht verknüpft , um genau zu sein) , während es noch durch einen oder mehrere Prozesse offen gehalten wird . 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 nach dem letzten Vorgang zurückgefordert, bei dem ein offenes Handle für die Datei beendet wird.
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:
Wenn Sie dies auf einem Unixish-System ausführen, sollte dies ungefähr die folgende Ausgabe erzeugen:
Unter Windows sieht die Ausgabe etwas anders aus:
In beiden Fällen sollte die temporäre Datei jedoch nach Beendigung des Programms nicht auf der Festplatte verbleiben.
Ps. Beim Testen dieses Codes unter Windows habe ich eine ziemlich überraschende Tatsache festgestellt: Anscheinend reicht es aus, die temporäre Datei nicht geschlossen zu lassen, um zu verhindern, dass sie gelöscht wird . Dies bedeutet natürlich auch, dass jeder Absturz, der während der Verwendung der temporären Datei auftritt, dazu führt, dass sie nicht gelöscht wird. Genau das versuchen wir hier zu vermeiden .
AFAIK, die einzige Möglichkeit, dies zu vermeiden, besteht darin, sicherzustellen, dass die temporäre Datei immer mit einem
finally
Block geschlossen wird . Dann können Sie natürlich auch die Datei im selbenfinally
Block löschen . Ich bin mir nicht sicher, was Sie, wenn überhaupt,.deleteOnExit()
tatsächlich dazu bringen würde.quelle
deleteOnExit()
ist, dass ein häufiger Aufruf (z. B. in einem System, das viele neue temporäre Dateien verwendet) wahrscheinlich einen Speicherverlust verursacht (da alle erforderlichen Pfade gespeichert werden müssen) gelöscht).Zumindest nicht von Java. Wenn Sie möchten, dass die Datei beim Beenden der JVM gelöscht wird, müssen Sie aufrufen
tmp.deleteOnExit()
.quelle
von: So löschen Sie temporäre Dateien in Java
Beispielsweise,
Im obigen Beispiel wird eine temporäre Datei mit dem Namen "abc.tmp" erstellt und gelöscht, 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.
quelle
Temporäre Datei wird verwendet, um die weniger wichtigen und temporären Daten zu speichern, die immer gelöscht werden sollten, wenn Ihr System beendet wird. Am besten verwenden Sie dazu File.deleteOnExit ().
Beispielsweise,
Im obigen Beispiel wird eine temporäre Datei mit dem Namen "abc.tmp" erstellt und gelöscht, wenn das Programm beendet oder beendet wird.
quelle
Sie können die Datei manuell löschen, bevor Sie den Prozess beenden, wenn Sie möchten. Wenn der Prozess jedoch beendet wird, wird die Datei ebenfalls gelöscht.
quelle
deleteOnExit()