Question

Je suis en train de supprimer un fichier qu'un autre thread dans mon programme a déjà travaillé avec.

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

Alors, comment puis-je savoir quel thread verrouille le fichier en java?

Était-ce utile?

La solution

Je ne vois pas avoir une réponse claire (et je ne pense pas qu'il y ait un ou l'autre, cela est contrôlé au niveau OS (natif), et non au niveau JVM) et je ne aussi pas vraiment la valeur de la réponse (vous ne pouvez toujours pas fermer le fichier programme une fois que vous découvert quel fil il est), mais je pense que vous ne savez pas encore que l'incapacité à supprimer est généralement lorsque le fichier est toujours ouvert. Cela peut se produire lorsque vous faites pas appeler explicitement Closeable#close() sur le InputStream, OutputStream, Reader ou Writer qui est construit autour de la File en question.

demo 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. langage normal est de le faire dans AutoCloseable , qui vous ouvrez vous (en utilisant le mot-clé new).

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

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

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

Hope this helps à clouer la cause racine de votre problème particulier.

Autres conseils

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

  

Chaque fois que lorsque le verrouillage fil machine virtuelle Java d'un fichier exclusivement, aussi verrouillage machine virtuelle Java       certains objet Jave , par exemple, je trouve dans mon cas:

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

Vous devez trouver exactement cet objet Java verrouillé et les analyser et   vous trouvez ce fil 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 (à l'aide java.nio.channels.FileLock, java.nio.channels. FileChannel et ainsi de suite)

Plus d'infos voir cette question

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top