Frage

Ich versuche eine Datei zu löschen, mit der ein anderer Thread in meinem Programm zuvor gearbeitet hat.

Ich kann die Datei nicht löschen, aber ich bin mir nicht sicher, wie ich herausfinden soll, welcher Thread die Datei verwendet.

Wie finde ich heraus, welcher Thread die Datei in Java sperrt?

War es hilfreich?

Lösung

Ich habe keine direkte Antwort (und ich glaube auch nicht, dass es eine gibt, die auf OS-Ebene (nativ) kontrolliert wird, nicht auf JVM-Ebene), und ich sehe auch den Wert der Antwort nicht wirklich ( Sie können die Datei immer noch nicht programmgesteuert schließen, sobald Sie herausgefunden haben, welcher Thread es ist. Dies kann passieren, wenn Sie dies tun nicht explizit anrufen Closeable#close() auf der InputStream, OutputStream, Reader oder Writer das ist um die gebaut File fraglich.

Grundlegende Demo:

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
}

Mit anderen Worten, stellen Sie sicher, dass der Code während Ihres gesamten Java IO -Zeugs richtig ist Schließen die Ressourcen nach dem Gebrauch. Die normale Idiom ist dies in zu tun das try-with-resources Aussage, damit Sie sicher sein können, dass die Ressourcen sowieso freigelassen werden, selbst im Fall von einem IOException. Z.B

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

Mach es für irgendein InputStream, OutputStream, Reader und Writer, usw. Was auch immer implementiert AutoCloseable, was Sie öffnen dich selbst (Verwendung der new Stichwort).

Dies ist technisch gesehen nicht für bestimmte Implementierungen erforderlich, wie z. ByteArrayOutputStream, Aber um der Klarheit willen, kleben Sie einfach die enge Idiom überall ein, um Missverständnisse und Refactoring-Sträuche zu vermeiden.

Wenn Sie noch nicht auf Java 7 oder neuer sind, verwenden Sie die unten try-finally Idiom stattdessen.

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

Ich hoffe, dies hilft, die Grundursache für Ihr spezielles Problem festzunehmen.

Andere Tipps

Zu dieser Frage versuche ich auch, diese Antwort herauszufinden und zu fragen diese Frage und Antwort finden:

Jedes Mal, wenn JVM Thread a Datei exklusiv auch JVM sperren einige Jave -Objekt, Zum Beispiel finde ich in meinem Fall:

  • sun.nio.fs.nativeBuffer
  • sun.nio.ch.util $ buffercache

Sie müssen also nur dieses gesperrte Java -Objekt finden und analysiert und herausfinden, welcher Thread Ihre Datei gesperrt hat.

Ich bin mir nicht sicher, ob es funktioniert, wenn die Datei gerade geöffnet ist (ohne ausschließlich gesperrt), aber ich bin sicher, dass dies funktioniert, wenn die Datei ausschließlich mit Thread (mit java.nio.channels.filelock, java.nio.channels.filechannel usw. gesperrt wird an)

Weitere Informationen sehen Sie diese Frage

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top