2010-02-01 9 views
6

J'essaie de supprimer un fichier avec lequel un autre thread de mon programme a déjà travaillé.Comment savoir quel thread verrouille un fichier dans Java?

Je ne parviens pas à supprimer le fichier, mais je ne suis pas sûr de savoir quel thread utiliser le fichier.

Alors, comment puis-je savoir quel thread verrouille le fichier dans Java?

+1

Les fichiers sont lokced par processus, et non par fil. Comme cela a été mentionné, vous devez fermer un fichier avant de pouvoir le supprimer. Je vous suggère de commencer par regarder où le fichier est ouvert. –

Répondre

7

Je n'ai pas de réponse claire (et je ne pense pas qu'il y en ait une, c'est contrôlé au niveau OS (natif), pas au niveau JVM) et je ne vois pas vraiment la valeur de la réponse (vous ne pouvez toujours pas fermer le fichier par programmation une fois que vous avez découvert quel thread il est), mais je pense que vous ne savez pas encore que l'incapacité à supprimer est généralement causée lorsque le fichier est toujours ouvert. Cela peut arriver lorsque vous faites pas explicitement appeler Closeable#close() sur le InputStream, OutputStream, Reader ou Writer qui est construit autour du File en question.

Démo de base:

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 d'autres termes, faire en sorte que l'ensemble de votre substance Java IO le code est correctement fermeture les ressources après utilisation. The normal idiom est de le faire dans the try-with-resources statement, de sorte que vous pouvez être certain que les ressources seront libérées de toute façon, même dans le cas d'un IOException. Par exemple.

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

Est-ce pour toute InputStream, OutputStream, Reader et Writer, etc tout en œuvre AutoCloseable, qui vous ouvrez vous (en utilisant le mot-clé new).

Ce qui est techniquement pas nécessaire sur certaines implémentations, comme ByteArrayOutputStream, mais par souci de clarté, juste adhérer la fermeture en enfin idiome partout pour éviter les idées fausses et refactoring-bugs.

Si vous n'êtes pas encore sur Java 7 ou plus récent, utilisez plutôt l'idiome try-finally ci-dessous.

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

Espérons que cela aide à déterminer la cause profonde de votre problème particulier.

+1

Excellente réponse, merci. – tomdee

+1

De rien. – BalusC

2

A propos de cette question, j'essaie aussi de trouver cette réponse, et demande this question et trouver réponse:

Chaque fois que lorsque le fil verrouiller un fichier machine virtuelle Java exclusivement, également verrouiller JVM certains objet Jave, par exemple, je trouve dans mon cas:

  • sun.nio.fs.NativeBuffer
  • sun.nio.ch.Util $ BufferCache

Vous avez juste besoin de trouver cet objet Java verrouillé et de les analyser et vous trouvez quel fil est verrouillé votre fichier.

Je ne sais pas qu'il fonctionne si le fichier vient d'ouvrir (sans verrouillé exclusivement), mais je suis sûr que le travail est si le fichier est verrouillé exclusivement par fil (en utilisant java.nio.channels.FileLock, java.nio .channels.FileChannel et ainsi de suite)

Plus d'info voir this question