Comment savoir quel fil est verrouillage d'un fichier en java?
-
24-09-2019 - |
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?
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