Qual è un modo sicuro per creare un file Temp in Java?


97

Sto cercando un modo sicuro per creare un file temporaneo in Java. Per sicuro intendo quanto segue:

  • Il nome dovrebbe essere univoco, anche in potenziali condizioni di competizione (ad esempio un altro thread chiama la stessa funzione contemporaneamente o un altro processo esegue questo codice contemporaneamente)
  • Il file dovrebbe essere privato, anche in potenziali condizioni di competizione (ad esempio un altro utente tenta di modificare il file ad alta velocità)
  • Posso dirgli di cancellare il file, senza che io debba fare una cancellazione generica, e rischiare di cancellare il file sbagliato
  • Idealmente, dovrebbe garantire che il file venga eliminato, anche se viene generata un'eccezione prima che ne abbia la possibilità
  • Il file dovrebbe essere impostato per impostazione predefinita in una posizione sana (ad esempio, la directory tmp specificata da JVM, impostata come predefinita sulla directory temp di sistema)

3
Usa File f = File.createTempFile(prefix, extension). Verrà inserito nella directory temp. E con f.deleteOnExit()esso verrà automaticamente eliminato all'uscita.
Barra rovesciata

3
Elimina all'uscita non eliminerà il file, se la macchina virtuale esce con un'eccezione.
Johannes

Risposte:


130

Usa File.createTempFile().

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

Creerà un file nella directory temporanea, come:

prefisso-6340763779352094442-suffisso


1
Per tua informazione, non devi preoccuparti di avere un prefisso / suffisso univoco, poiché Java creerà una stringa casuale di numeri in mezzo.
Squeazer

4
Super! Qualche problema nel fare un normale tempFile.delete()oltre al deleteOnExit(dato che non voglio avere orde di file temporanei in giro prima dell'uscita)?
SRobertJames

3
No, puoi farlo in entrambi i casi.
Stefan

1
@SRobertJames: Nessun problema. Il fatto è che la creazione di file temporanei con nomi prevedibili impone problemi di sicurezza. Una volta creati in modo sicuro con le autorizzazioni appropriate, non lo fanno.
Markus W Mahlberg

1
Non lo considererei sicuro, il file creato è leggibile in tutto il mondo e risiede nella directory tmp che tende ad essere accessibile a qualsiasi utente.
Peter Gerber


0
String tempfilePath = System.getProperty("java.io.tmpdir");
tempfilePath = tempfilePath.concat("filename.extension");

non richiede prefisso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.