¿Cuál es una forma segura de crear un archivo temporal en Java?

97

Estoy buscando una forma segura de crear un archivo temporal en Java. Por seguro, me refiero a lo siguiente:

  • El nombre debe ser único, incluso bajo posibles condiciones de carrera (por ejemplo, otro subproceso llama a la misma función al mismo tiempo u otro proceso ejecuta este código simultáneamente)
  • El archivo debe ser privado, incluso bajo posibles condiciones de carrera (por ejemplo, otro usuario intenta modificar el archivo a una velocidad alta)
  • Puedo decirle que elimine el archivo, sin tener que hacer una eliminación genérica y correr el riesgo de eliminar el archivo incorrecto.
  • Idealmente, debería asegurarse de que el archivo se elimine, incluso si se lanza una excepción antes de tener la oportunidad de
  • El archivo debe tener por defecto una ubicación sana (por ejemplo, el directorio tmp especificado por JVM, por defecto el directorio temporal del sistema)
SRobertJames
fuente
3
Utilice File f = File.createTempFile(prefix, extension). Se colocará en el directorio temporal. Y con f.deleteOnExit()él se eliminará automáticamente al salir.
BackSlash
3
Delete on Exit no eliminará el archivo, si la máquina virtual se cierra con una excepción.
Johannes

Respuestas:

130

Utilice File.createTempFile().

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

Creará un archivo en el directorio temporal, como:

prefijo-6340763779352094442-sufijo

Stefan
fuente
1
Para su información, no necesita preocuparse por tener un prefijo / sufijo único, ya que Java creará una Cadena aleatoria de números en el medio.
Squeazer
4
¡Súper! ¿Algún problema para hacer lo normal tempFile.delete()además del deleteOnExit(ya que no quiero tener hordas de archivos temporales merodeando antes de salir)?
SRobertJames
3
No, puedes hacerlo de cualquier manera.
Stefan
1
@SRobertJames: No hay problemas. El caso es que la creación de tempfiles con nombres predecibles impone problemas de seguridad. Una vez que se crean de forma segura con los permisos adecuados, no lo hacen.
Markus W Mahlberg
1
No consideraría esto seguro, el archivo creado es legible en todo el mundo y reside en el directorio tmp que tiende a ser accesible para cualquier usuario.
Peter Gerber
38

Desde Java 7 existe la nueva API de archivos "NIO2" que contiene nuevos métodos para crear archivos y directorios temnp. Ver

p.ej

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

o

Path tempFile = Files.createTempFile("tempfiles", ".tmp");
Tim Büthe
fuente
1
Prefiero NIO, que no requiere prefijo.
Franklin Yu
0
String tempfilePath = System.getProperty("java.io.tmpdir");
tempfilePath = tempfilePath.concat("filename.extension");

no requiere prefijo.

Fairyjee
fuente