Я работаю со сторонней библиотекой манипуляций JPEG/EXIF (Mediautil), которая вызывает у меня некоторые головные боли. Я хочу изменить данные EXIF изображения. Для этого мне нужно написать обновленную версию во временный файл, удалить оригинал, а затем переименовать файл temp в исходное имя.
Моя проблема заключается в том, что вызов File.delete()
завершается с ошибкой и возвращает false
, по-видимому, потому что библиотека все еще открыта каким-то образом - но я сделал все, что я могу найти в API, чтобы закрыть все потоки. Еще хуже: проблема, по-видимому, зависит от времени, и тесты Unit, где это происходит, иногда терпят неудачу, а иногда и нет, но код не многопоточен.
Необычно, есть один вызов библиотеки, который устраняет проблему, но также удаляет эскиз EXIF, которого я действительно не хочу. И, глядя на код, я абсолютно не вижу, где он закрывает любые потоки, которые в противном случае могли бы оставаться открытыми.
Есть идеи, как атаковать эту проблему?
Edit:
Это в Windows XP, Java 6. И еще одно: я выяснил, что если я вызываю System.gc()
перед вызовом File.delete()
, он работает - по-видимому, потому что это вызывает некоторый финализатор. Таким образом, это определенно кажется незакрытым потоком.