Вопрос

Я пытаюсь удалить файл, с которым ранее работал другой поток в моей программе.

Я не могу удалить файл, но я не уверен, как выяснить, какой нить может использовать файл.

Итак, как я могу узнать, какой поток блокирует файл в Java?

Это было полезно?

Решение

У меня нет прямого ответа (и я не думаю, что есть один, это управляется на уровне ОС (родной), а не на уровне JVM), и я также не вижу значение ответа ( Вы до сих пор не можете программно закрыть файл, когда вы узнаете, какой это нить есть), но я думаю, что вы еще не знаете, что невозможно удалить, обычно вызывается, когда файл все еще открыт. Это может произойти, когда вы делаете нет Явный звонок Closeable#close() на InputStream, OutputStream, Reader или Writer который построен вокруг File обсуждаемый.

Основная демонстрация:

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
}

Другими словами, убедитесь, что на протяжении всей всей вашей Java io материал код правильно закрытие ресурсы после использования. Нормальная идиома это сделать это в то try-with-resources утверждение, так что вы можете быть уверены, что ресурсы будут свободны в любом случае, даже в случае IOException. Отказ Например

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

Сделай это Любые InputStream, OutputStream, Reader а также Writer, и т.д. Что бы ни навещали AutoCloseable, который вы открываете сами (с использованием new ключевое слово).

Это технически не нужно для определенных реализаций, таких как ByteArrayOutputStream, но ради ясности, просто придерживайтесь идиома рядом, наконец, везде, чтобы избежать заблуждений и рефакторинга.

Если вы еще не на Java 7 или новее, то используйте ниже try-finally idiom вместо этого.

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

Надеюсь, это поможет призвать причину вашей конкретной проблемы.

Другие советы

Об этом вопросе, я также пытаюсь выяснить этот ответ и спросить этот вопрос и найти ответ:

Каждый раз, когда заблокируйте нить JVM файл Исключительно, также блокировка JVM некоторые Объект Жафа, Например, я нахожу в моем случае:

  • Sun.nio.fs.nativeBuffer
  • sun.nio.ch.util $ Buffercache.

Таким образом, вам нужно просто найти этот заблокированный объект Java и проанализировал их, и вы найдете, какой поток заблокирован ваш файл.

Я не уверен, что он работает, если файл просто открыт (не заблокирован исключительно), но я уверен, что это работает, если файл будет заблокирован исключительно по теме (с помощью java.nio.channels.filellock, java.nio.channels.filechannel и так на)

Больше информации см этот вопрос

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top