Como las otras respuestas en cuenta, los archivos temporales creados con File.createTempFile()
se no se eliminarán de forma automática a menos que solicite explícitamente.
La forma genérica y portátil de hacer esto es llamar .deleteOnExit()
al File
objeto, que programará el archivo para su eliminación cuando finalice la JVM. Sin embargo, una pequeña desventaja de este método es que solo funciona si la VM termina normalmente; en una terminación anormal (es decir, una falla de la máquina virtual o la terminación forzada del proceso de la máquina virtual), el archivo puede permanecer sin eliminar.
En sistemas Unixish (como Linux), es posible obtener una solución algo más confiable eliminando el archivo temporal inmediatamente después de abrirlo . Esto funciona porque los sistemas de archivos Unix permiten que un archivo sea eliminado ( desvinculado , para ser precisos) mientras aún está abierto por uno o más procesos. Se puede acceder a dichos archivos normalmente a través del identificador de archivo abierto, y el sistema operativo solo recuperará el espacio que ocupan en el disco después de que salga el último proceso que tiene un identificador abierto para el archivo.
Entonces, esta es la forma más confiable y portátil que conozco de asegurarme de que un archivo temporal se eliminará correctamente después de que el programa salga:
import java.io.File;
import java.io.RandomAccessFile;
import java.io.IOException;
public class TempFileTest
{
public static void main(String[] args)
{
try {
File temp = File.createTempFile("tempfiletest", ".tmp");
String path = temp.getAbsolutePath();
System.err.println("Temp file created: " + path);
RandomAccessFile fh = new RandomAccessFile (temp, "rw");
System.err.println("Temp file opened for random access.");
boolean deleted = false;
try {
deleted = temp.delete();
} catch (SecurityException e) {
}
if (deleted) {
System.err.println("Temp file deleted.");
} else {
temp.deleteOnExit();
System.err.println("Temp file scheduled for deletion.");
}
try {
String str = "A quick brown fox jumps over the lazy dog.";
fh.writeUTF(str);
System.err.println("Wrote: " + str);
fh.seek(0);
String out = fh.readUTF();
System.err.println("Read: " + out);
} finally {
fh.close();
System.err.println("Temp file closed.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
En un sistema Unixish, ejecutar esto debería producir algo como el siguiente resultado:
Temp file created: /tmp/tempfiletest587200103465311579.tmp
Temp file opened for random access.
Temp file deleted.
Wrote: A quick brown fox jumps over the lazy dog.
Read: A quick brown fox jumps over the lazy dog.
Temp file closed.
mientras que en Windows, la salida se ve ligeramente diferente:
Temp file created: C:\DOCUME~1\User\LOCALS~1\Temp\tempfiletest5547070005699628548.tmp
Temp file opened for random access.
Temp file scheduled for deletion.
Wrote: A quick brown fox jumps over the lazy dog.
Read: A quick brown fox jumps over the lazy dog.
Temp file closed.
En cualquier caso, sin embargo, el archivo temporal no debe permanecer en el disco una vez finalizado el programa.
PD. Mientras probaba este código en Windows, observé un hecho bastante sorprendente: aparentemente, simplemente dejar el archivo temporal sin cerrar es suficiente para evitar que se elimine . Por supuesto, esto también significa que cualquier falla que ocurra mientras el archivo temporal está en uso hará que no se elimine, que es exactamente lo que estamos tratando de evitar aquí.
AFAIK, la única forma de evitar esto es asegurarse de que el archivo temporal siempre se cierre usando un finally
bloque. Por supuesto, también podría eliminar el archivo en el mismo finally
bloque. No estoy seguro de qué, en todo caso, el uso .deleteOnExit()
realmente te beneficiaría con eso.