Was ist ein sicherer Weg, um eine Temp-Datei in Java zu erstellen?

95

Ich suche nach einer sicheren Möglichkeit, eine temporäre Datei in Java zu erstellen. Mit sicher meine ich Folgendes:

  • Der Name sollte auch unter möglichen Rennbedingungen eindeutig sein (z. B. ruft ein anderer Thread zur gleichen Zeit dieselbe Funktion auf oder ein anderer Prozess führt diesen Code gleichzeitig aus).
  • Die Datei sollte auch unter potenziellen Rennbedingungen privat sein (z. B. versucht ein anderer Benutzer, die Datei mit hoher Geschwindigkeit zu ändern).
  • Ich kann es anweisen, die Datei zu löschen, ohne dass ich generisch löschen muss, und riskieren, die falsche Datei zu löschen
  • Im Idealfall sollte sichergestellt werden, dass die Datei gelöscht wird, auch wenn eine Ausnahme ausgelöst wird, bevor ich die Möglichkeit dazu bekomme
  • Die Datei sollte standardmäßig einen vernünftigen Speicherort haben (z. B. das von der JVM angegebene tmp-Verzeichnis, standardmäßig das temporäre Systemverzeichnis).
SRobertJames
quelle
3
Verwenden Sie File f = File.createTempFile(prefix, extension). Es wird in das temporäre Verzeichnis gestellt. Und f.deleteOnExit()damit wird es beim Beenden automatisch gelöscht.
BackSlash
3
Beim Beenden löschen wird die Datei nicht gelöscht, wenn die VM mit einer Ausnahme beendet wird.
Johannes

Antworten:

128

Verwenden Sie File.createTempFile().

File tempFile = File.createTempFile("prefix-", "-suffix");
//File tempFile = File.createTempFile("MyAppName-", ".tmp");
tempFile.deleteOnExit();

Erstellt eine Datei im temporären Verzeichnis, wie:

Präfix-6340763779352094442-Suffix

Stefan
quelle
1
Nur zu Ihrer Information, Sie müssen sich keine Gedanken über ein eindeutiges Präfix / Suffix machen, da Java eine zufällige Folge von Zahlen dazwischen erstellt.
Squeazer
4
Super! Gibt es ein Problem mit dem Normalen tempFile.delete()zusätzlich zu dem deleteOnExit(da ich nicht möchte, dass Horden von temporären Dateien vor dem Beenden herumhängen)?
SRobertJames
2
Nein, du kannst es so oder so machen.
Stefan
1
@SRobertJames: Keine Probleme. Die Sache ist, dass die Erstellung von Tempfiles mit vorhersehbaren Namen Sicherheitsprobleme mit sich bringt. Sobald sie auf sichere Weise mit den richtigen Berechtigungen erstellt wurden, tun sie dies nicht mehr.
Markus W Mahlberg
1
Ich würde dies nicht für sicher halten, die erstellte Datei ist weltweit lesbar und befindet sich im tmp-Verzeichnis, auf das normalerweise jeder Benutzer zugreifen kann.
Peter Gerber
37

Seit Java 7 gibt es die neue Datei-API "NIO2", die neue Methoden zum Erstellen von temporären Dateien und Verzeichnissen enthält. Sehen

z.B

Path tempDir = Files.createTempDirectory("tempfiles");

oder

Path tempFile = Files.createTempFile("tempfiles", ".tmp");
Tim Büthe
quelle
1
Ich bevorzuge NIO, für das kein Präfix erforderlich ist.
Franklin Yu