No tengo una respuesta directa (y tampoco creo que haya ninguna, esto se controla a nivel de sistema operativo (nativo), no a nivel de JVM) y tampoco veo realmente el valor de la respuesta (aún no puede cerrar el archivo mediante programación una vez que descubrió qué hilo es), pero creo que aún no sabe que la incapacidad de eliminar suele producirse cuando el archivo aún está abierto. Esto puede suceder cuando hace no llame explícitamente al Closeable#close()
en el InputStream
, OutputStream
, Reader
o Writer
que se construye alrededor del File
en cuestión.
demostración básica:
public static void main(String[] args) throws Exception {
File file = new File("c:/test.txt"); // Precreate this test file first.
FileOutputStream output = new FileOutputStream(file); // This opens the file!
System.out.println(file.delete()); // false
output.close(); // This explicitly closes the file!
System.out.println(file.delete()); // true
}
En otras palabras, asegúrese de que a lo largo de toda su materia Java IO es el código correctamente cierre los recursos después de su uso. The normal idiom es hacer esto en the try-with-resources
statement, para que pueda estar seguro de que los recursos se liberarán de todos modos, incluso en el caso de un IOException
. P.ej.
try (OutputStream output = new FileOutputStream(file)) {
// ...
}
lo haga por cualquier InputStream
, OutputStream
, Reader
y Writer
, etc lo implementa AutoCloseable
, que va a abrir mismo (usando la palabra clave new
).
Esta técnica no es necesario en ciertas implementaciones, como ByteArrayOutputStream
, pero en aras de la claridad, simplemente se adhieren al cierre-en-modismo finalmente todas partes para evitar malentendidos y refactorización-bugs.
En caso de que aún no tenga Java 7 o una versión más reciente, utilice la expresión siguiente try-finally
.
OutputStream output = null;
try {
output = new FileOutputStream(file);
// ...
} finally {
if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
}
Espero que esto ayude a determinar la causa raíz de su problema en particular.
archivos se lokced por proceso, no por hilo. Como se ha mencionado, debe cerrar un archivo antes de poder eliminarlo. Sugiero que comiences mirando dónde se abre el archivo. –