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