Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ImageIcon и нежелательная буферизация 
V
    Опции темы
feanor59
Дата 26.10.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 24.1.2008
Где: Пермь

Репутация: нет
Всего: нет



Суть в следующем.
Имеется метод работы с изображением, изменяющий его размеры.
Там есть строчки:
Код

ImageIcon imageIcon = new ImageIcon(imageFile.getPath());
int width = imageIcon.getIconWidth();
int height = imageIcon.getIconHeight();
...

Так вот. 
Сначала имеем некоторый файл, открытый как
Код

File uploadedFile = new File("file.jpg");

При первом использовании метода, всё работает отлично, но если в дальнейшем изменить содержание файла file.jpg, то при
его открытии 
Код

ImageIcon imageIcon = new ImageIcon(imageFile.getPath());
 его содержание подменяется содержанием оригинального файла, т. е. того, что был изменён первым.
Как можно сбросить этот буфер?

Это сообщение отредактировал(а) feanor59 - 26.10.2009, 21:54
PM MAIL ICQ GTalk   Вверх
magicfly
Дата 26.10.2009, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 21.2.2007

Репутация: нет
Всего: 1



Вы закрываете файл и поток после работы?
PM MAIL   Вверх
feanor59
Дата 27.10.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 24.1.2008
Где: Пермь

Репутация: нет
Всего: нет



Цитата(magicfly @ 26.10.2009,  22:04)
Вы закрываете файл и поток после работы?

Да, разумеется. Более того, после внесения изменений в графический файл, они отображаются в просмотрщиках изображений, т. е.  запись действительно происходит, а не остаётся в кеше. Но тем не менее, при ImageIcon imageIcon = new ImageIcon(filePath); imageIcon хранит дескриптор старого файла (к примеру разрешение изображения, полученного из imageIcon соответствует разрешению старого файла). И, соответственно, при записи imageIcon в файл, записывается старое изображение.
PM MAIL ICQ GTalk   Вверх
mgarin
Дата 28.10.2009, 05:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 19.8.2009
Где: Санкт-Петербург

Репутация: 1
Всего: 3



Натыкался на эти грабли smile
Это буфер непосредственно ImageIcon, точнее даже Image который в нем хранится
При своем создании он подкачивает один раз ресурсы из файла и в дальнейшем,
в течение жизни ява приложения использует уже подкачанный ранее файл при повторном обращении.

Сбросить, если мне не изменяет память, можно вот так:
Код
imageIcon.getImage ().flush ();

Если не помогает, могу откопать проект, где это было использовано и уточнить...

Еще точно помню всегда свежее изображение подкачивается если его брать вот так:
Код
Toolkit.getDefaultToolkit ().createImage ( imageFile.getPath() );


А вот такой метод опять же заставит вас наткнуться на грабли кэша:
Код
Toolkit.getDefaultToolkit ().getImage ( imageFile.getPath() );


Причем если посмотреть комментарий 2го метода (getImage):
Цитата
/**
     * Returns an image which gets pixel data from the specified file,
     * whose format can be either GIF, JPEG or PNG.
     * The underlying toolkit attempts to resolve multiple requests
     * with the same filename to the same returned Image.
     * <p>
     * Since the mechanism required to facilitate this sharing of
     * <code>Image</code> objects may continue to hold onto images
     * that are no longer in use for an indefinite period of time,
     * developers are encouraged to implement their own caching of
     * images by using the {@link #createImage(java.lang.String) createImage}
     * variant wherever available.
     ...
    */


Т.е. при использовании метода createImage подразумевается что разработчик сам задействует свой некий механизм кэша ;)

Кстати, к вопросу, почему ImageIcon тоже кэширует это дело:
Код
    public ImageIcon(String filename, String description) {
    image = Toolkit.getDefaultToolkit().getImage(filename);
        if (image == null) {
            return;
        }
    this.filename = filename; 
        this.description = description;
    loadImage(image);
    }


Toolkit.getDefaultToolkit().getImage(filename); - ничего не напоминает? ;)

Это сообщение отредактировал(а) mgarin - 28.10.2009, 05:20
PM MAIL WWW ICQ   Вверх
feanor59
Дата 28.10.2009, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 24.1.2008
Где: Пермь

Репутация: нет
Всего: нет



mgarin, огромное спасибо! пофиксил.
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1138 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.