Pregunta

Estoy tratando de eliminar un archivo con el que otro hilo dentro de mi programa ha funcionado anteriormente.

No puedo eliminar el archivo, pero no estoy seguro de cómo averiguar qué hilo puede estar usando el archivo.

Entonces, ¿cómo descubro qué hilo está bloqueando el archivo en Java?

¿Fue útil?

Solución

No tengo una respuesta directa (y tampoco creo que haya una, esto se controla a nivel de sistema operativo (nativo), no a nivel JVM) y tampoco veo el valor de la respuesta ( Todavía no puede cerrar el archivo mediante una vez que descubra qué hilo es), pero creo que aún no sabe que la incapacidad de eliminar generalmente se causa cuando el archivo aún está abierto. Esto puede suceder cuando lo haces no Llamar explícitamente Closeable#close() sobre 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 todo su material de Java Io el código esté correctamente clausura los recursos después de su uso. El idioma normal es hacer esto en la try-with-resources declaración, para que pueda estar seguro de que los recursos se liberarán de todos modos, incluso en caso de un IOException. P.ej

try (OutputStream output = new FileOutputStream(file)) {
    // ...
}

Que lo haga por ningún InputStream, OutputStream, Reader y Writer, etc que sea lo que implementa AutoCloseable, que estás abriendo tú mismo (utilizando el new palabra clave).

Esto técnicamente no es necesario en ciertas implementaciones, como ByteArrayOutputStream, pero en aras de la claridad, solo adhiera el idioma cercano en todas partes para evitar conceptos erróneos y refactorizaciones.

En caso de que no esté en Java 7 o más nuevo todavía, use el siguiente try-finally moderno en su lugar.

OutputStream output = null;
try {
    output = new FileOutputStream(file);
    // ...
} finally {
    if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
}

Espero que esto ayude a clavar la causa raíz de su problema particular.

Otros consejos

Sobre esta pregunta, también trato de averiguar esta respuesta y preguntar esta pregunta y encontrar respuesta:

Cada vez que el hilo JVM bloquea un expediente exclusivamente, también JVM bloquea algunos Objeto jave, por ejemplo, encuentro en mi caso:

  • sun.nio.fs.nativeBuffer
  • sun.nio.ch.util $ buffercache

Por lo tanto, debe encontrar este objeto Java bloqueado y analizarlo y encontrará qué hilo bloqueó su archivo.

No estoy seguro de que funcione si el archivo simplemente se abre (sin bloquear exclusivamente), pero estoy seguro de que es funcionar si el archivo se bloquea exclusivamente por hilo (usando java.nio.channels.filelock, java.nio.channels.filechannel y así en)

Más información ver esta pregunta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top