У меня небольшое Java настольное приложение, оно читает некоторые файлы изображений и отображает их. Проблема в том, что когда я хочу выполнить что-то (скажем, операцию exiftool) с этими файлами, он отказывается, потому что Java все еще использует их.
edit: это происходит только на Windows, вы невозможно записать анимированный GIF-файл (преобразованный в объект URL), который обрабатывается (отображается) с помощью Java, но в Ubuntu вы можете редактировать метаданные этого файла, система не считает, что файл обрабатывается.
Вот эта часть моего кода.
Я читаю файл;
ImageInputStream iis = null;
ImageReader reader = null;
iis = ImageIO.createImageInputStream(
f);
Iterator<ImageReader> imageReaders = ImageIO.getImageReaders(iis);
reader = (ImageReader) imageReaders.next();
Path pathe = f.toPath();
String mimeType = Files.probeContentType(pathe);
ImageIcon icon = null;
Здесь я обрабатываю изображения, изменяю их размер и создаю JLabel для их просмотра.
Причина, по которой я не просто использую Java ImageIO для заполнения этой метки изображением, ImageIO может отображать только первый кадр анимированного файла GIF. Преобразование изображения в URL таким образом поддерживает анимацию изображения (даже после изменения размера).
ImageIcon icon = null;
Integer labelWidth = this.imageLabel.getWidth();
Integer labelHeight = this.imageLabel.getHeight();
URI img;
img = f.toURI();
URL umg = img.toURL();
icon = new ImageIcon(umg);
//some calculations for setting labelWidth and labelHeight here
icon.setImage(icon.getImage().getScaledInstance(labelWidth, labelHeight,
Image.SCALE_DEFAULT));
В конце потоки закрываются.
this.imageLabel.setIcon(icon);
iis.close();
reader.dispose();
И затем я пытаюсь выполнить некоторые Команды exiftool через процесс успешно считывают метаданные изображения. Но при обновлении данных появляется сообщение «Ошибка переименования временного файла в C: / Users / path ...», если изображение представляет собой анимированный GIF. Никаких проблем не возникает, если изображение не анимированное, JPEG, PNG или GIF, оно может считывать и обновлять метаданные, я полагаю.
Когда я отменяю изображение, отображающее часть кода, я могу писать на метаданные изображения без ошибок. Если я читаю файл JPEG и отображаю его, проблем нет. Если я читаю анимированный GIF и отображаю его (анимированный, поддерживает ли он соединение с файлом открытым?), Я не смогу изменить этот файл, ни в моей программе, ни в cmd.exe, пока сеанс отладки не закрыт. После завершения отладки процесс exiftool на cmd.exe начинает работать нормально.
Закрытие ImageInputStream или ImageReader не помогло.
Есть ли способ сделать процесс Java (если файл анимированные, я использую URI, классы URL) освободить файл после операции чтения? Есть ли в этих классах, которые я упоминал, методы для освобождения, закрытия, выключения, уничтожения и т. Д. c. Мне нужно прочитать анимированные изображения, отобразить их анимированные и выполнить над ними операции обновления.