2010-02-01 25 views
6

Estoy intentando eliminar un archivo con el que otro subproceso de mi programa haya trabajado anteriormente.¿Cómo saber qué hilo está bloqueando un archivo en Java?

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

Entonces, ¿cómo puedo saber qué hilo está bloqueando el archivo en java?

+1

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. –

Respuesta

7

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.

+1

Excelente respuesta, gracias. – tomdee

+1

De nada. – BalusC

2

Sobre esta cuestión, también trato de averiguar esta respuesta, y pido this question y encontrar la respuesta:

Cada vez que el hilo JVM bloquear un archivoexclusivamente, también Bloqueo JVM algunos objeto Jave, por ejemplo, que encuentro en mi caso:

  • sun.nio.fs.NativeBuffer
  • sun.nio.ch.Util $ antememoria intermedia

por lo que necesita simplemente encontrar este objeto Java bloqueado y los analizaron y Ha encontrado lo hilo bloqueado el archivo.

No estoy seguro de que funciona si solo archivo abierto (sin bloqueada de forma exclusiva), pero estoy seguro de que es un trabajo si el archivo se bloqueará exclusivamente por Tema (usando java.nio.channels.FileLock, java.nio .channels.FileChannel y así sucesivamente)

Más información ver this question

Cuestiones relacionadas