herramienta - ¿Cuándo se eliminan los archivos temporales de Java?
herramienta eliminar java (6)
Si no hago una llamada explícita al método
delete()
, ¿cuándo se eliminará el archivo?
No lo hará, al menos no por Java. Si desea que el archivo se elimine cuando finalice la JVM, deberá llamar a tmp.deleteOnExit()
.
Supongamos que creo un archivo temporal en Java con el método
File tmp = File.createTempFile(prefix, suffix);
Si no hago una llamada explícita al método delete()
, ¿cuándo se eliminará el archivo?
Como intuición, puede ser cuando termina la JVM, o antes (por el recolector de basura), o más tarde (por algún proceso de barrido del sistema operativo).
Como se señala en las otras respuestas, los archivos temporales creados con File.createTempFile()
no se eliminarán automáticamente a menos que usted lo solicite explícitamente.
La forma genérica y portátil de hacer esto es llamar a .deleteOnExit()
en el objeto File
, que programará el archivo para su eliminación cuando finalice la JVM. Una ligera desventaja de este método, sin embargo, es que solo funciona si la VM termina normalmente; en una terminación anormal (es decir, un bloqueo de VM o la terminación forzada del proceso de VM), el archivo puede permanecer sin recuperar.
En sistemas Unixish (como Linux), en realidad 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 eliminar un archivo (sin vincular , para ser precisos) mientras uno o más procesos lo mantienen abierto. Se puede acceder normalmente a dichos archivos a través del identificador de archivo abierto, y el espacio que ocupan en el disco solo será reclamado por el sistema operativo después de que el último proceso tenga un identificador abierto para el archivo.
Así que esta es la forma más confiable y portátil que conozco para garantizar que un archivo temporal se elimine correctamente después de que el programa finalice:
import java.io.File;
import java.io.RandomAccessFile;
import java.io.IOException;
public class TempFileTest
{
public static void main(String[] args)
{
try {
// create a temp file
File temp = File.createTempFile("tempfiletest", ".tmp");
String path = temp.getAbsolutePath();
System.err.println("Temp file created: " + path);
// open a handle to it
RandomAccessFile fh = new RandomAccessFile (temp, "rw");
System.err.println("Temp file opened for random access.");
// try to delete the file immediately
boolean deleted = false;
try {
deleted = temp.delete();
} catch (SecurityException e) {
// ignore
}
// else delete the file when the program ends
if (deleted) {
System.err.println("Temp file deleted.");
} else {
temp.deleteOnExit();
System.err.println("Temp file scheduled for deletion.");
}
try {
// test writing data to the file
String str = "A quick brown fox jumps over the lazy dog.";
fh.writeUTF(str);
System.err.println("Wrote: " + str);
// test reading the data back from the file
fh.seek(0);
String out = fh.readUTF();
System.err.println("Read: " + out);
} finally {
// close the file
fh.close();
System.err.println("Temp file closed.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
En un sistema Unixish, ejecutar esto debería producir algo así 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 después de que el programa haya finalizado.
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 caída que ocurra mientras el archivo temporal está en uso causará 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 bloque finally
. Por supuesto, entonces también podrías borrar el archivo en el mismo bloque final. No estoy seguro de qué, en todo caso, usar .deleteOnExit()
realmente te haría ganar más de eso.
El archivo no se eliminará automáticamente, desde JavaDoc :
Este método proporciona solo una parte de una instalación de archivo temporal. Para organizar que un archivo creado por este método se elimine automáticamente, utilice el método deleteOnExit ().
Entonces tienes que llamar explícitamente a deleteOnExit () :
Solicita que el archivo o directorio indicado por esta ruta de acceso abstracta se elimine cuando finaliza la máquina virtual.
El archivo temporal se utiliza para almacenar los datos menos importantes y temporales, que siempre se deben eliminar cuando se finaliza su sistema. La mejor práctica es usar File.deleteOnExit () para hacerlo.
Por ejemplo,
File temp = File.createTempFile("abc", ".tmp");
temp.deleteOnExit();
El ejemplo anterior creará un archivo temporal llamado "abc.tmp" y lo eliminará cuando el programa finalice o salga.
Puede eliminar manualmente el archivo antes de finalizar el proceso si así lo desea, sin embargo, cuando finalice el proceso, también se eliminará el archivo.
from: Cómo eliminar un archivo temporal en Java
El archivo temporal se utiliza para almacenar los datos menos importantes y temporales, que siempre se deben eliminar cuando se finaliza su sistema . La mejor práctica es usar File.deleteOnExit () para hacerlo.
Por ejemplo,
File temp = File.createTempFile("abc", ".tmp");
temp.deleteOnExit();
El ejemplo anterior creará un archivo temporal llamado "abc.tmp" y lo eliminará cuando el programa finalice o salga .
Si desea eliminar el archivo temporal manualmente , aún puede usar File.delete ().