¿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)

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


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


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

no requiere prefijo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.