Я пытаюсь удалить файл, с которым ранее работал другой поток в рамках моей программы.
Я не могу удалить файл, но я не уверен, как выяснить, какой поток может использовать файл.
Таким образом, как я узнаю, какой поток блокировка является файлом в Java?
У меня нет прямого ответа (и я не думаю, что он тоже есть, он управляется на уровне операционной системы (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) {}
}
Надеюсь, это поможет установить первопричину вашей конкретной проблемы.