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