Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Правильное использование потоков.


Автор: Illdisposed 15.9.2012, 13:05
Здравствуйте!
Изучаю Java, но до конца не могу понять работу с потоками. Вот например код из библиотеки:
Код

private byte[] writeJpeg(BufferedImage image, float quality) throws IOException {
    ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
    JPEGImageWriteParam params = (JPEGImageWriteParam) writer.getDefaultWriteParam();
    params.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
    params.setCompressionQuality(quality);
    ByteArrayOutputStream data = new ByteArrayOutputStream();
    writer.setOutput(ImageIO.createImageOutputStream(data));
    writer.write(null, new IIOImage(image, null, null), params);
    return data.toByteArray();
}

Я не понимаю тут все нормально с потоками, ничего не надо закрывать? Честно сказать подобный код довольно часто встречается.
Прошу прощения за такой вопрос, буду рад если ответите.

Автор: COVD 15.9.2012, 17:28
Если метод предполагает однократное использование, то логично, если метод сам освободит все ресурсы по завершению. Создали райтер, записали один раз, райтер выбросили.   

Автор: AntonSaburov 16.9.2012, 14:04
Цитата(Illdisposed @  15.9.2012,  13:05 Найти цитируемый пост)
Я не понимаю тут все нормально с потоками, ничего не надо закрывать? 

Может быт проблема с передаваемым параметром image - это ссылка на объект и этот объект может быть изменен в тот момент, когда над ним происходит действие.

Автор: Illdisposed 16.9.2012, 17:01
А то, что ByteArrayOutputStream data не закрывается в конце, это нормально? И поток, который создает вызов ImageIO.createImageOutputStream(data) не закрывается, тоже нормально?

Автор: COVD 16.9.2012, 17:27
Наверное, нормально.

Closing a ByteArrayOutputStream has no effect. -> http://docs.oracle.com/javase/1.4.2/docs/api/java/io/ByteArrayOutputStream.html#close()

Автор: Illdisposed 16.9.2012, 17:45
COVD, 
Как я понимаю можно не закрывать и ImageOutputStream который создается с помощью ImageIO.createImageOutputStream? В документации ничего не написано по этому поводу.

Автор: jk1 17.9.2012, 10:16
Цитата

Как я понимаю можно не закрывать и ImageOutputStream который создается с помощью ImageIO.createImageOutputStream? 


ImageIO использует более сложный механизм для менеджмента потоков ввода/вывода. При создании с ними ассоциируются коллбэки, закрывающие потоки. То есть ImageOutputStream и ImageInputStream можно закрывать, а можно и нет - тогда классы imageio сделают это за вас как минимум при завершении работы JVM. См также http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/774083387e81/src/share/classes/com/sun/imageio/stream/StreamCloser.java

Автор: Illdisposed 19.9.2012, 05:56
jk1, 
Большое спасибо за объяснения!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)