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

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

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

Таким образом, как я узнаю, какой поток блокировка является файлом в Java?

7
задан Jon Seigel 20 March 2010 в 19:45
поделиться

1 ответ

У меня нет прямого ответа (и я не думаю, что он тоже есть, он управляется на уровне операционной системы (native), а не на уровне 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, который вы открываете самостоятельно (используя ключевое слово новое ).

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

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

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

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

7
ответ дан 7 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: