Как выяснить, какой поток блокирует файл в Java?
-
24-09-2019 - |
Вопрос
Я пытаюсь удалить файл, с которым ранее работал другой поток в моей программе.
Я не могу удалить файл, но я не уверен, как выяснить, какой нить может использовать файл.
Итак, как я могу узнать, какой поток блокирует файл в 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 и так на)
Больше информации см этот вопрос