2016-11-11 7 views
1

Имея java.awt.image.BufferedImage я получаю и возвращая ByteArrayOutputStream по:Java BufferedImage к ByteArrayOutputStream без тесного ByteArrayOutputStream

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(combined, "png", baos); 
return baos; 

Тогда я генерировать представление base64 должен быть возвращен на REST конечной точки:

return new String(Base64.encodeBase64(baos.toByteArray()), Charset.forName("UTF-8")); 

Мой вопрос: должен ли я смывать и закрывать баос?

(я никогда не понимал правильно, когда я должен закрыть BAOS, а когда нет, так что любая подсказка будет понятно)

+2

Check [this] (http://stackoverflow.com/questions/23164598/java-is-bytearrayoutputstream-safe-without-flush-and-close) topic – Squiddie

+1

Если вы используете Java 7, попробуйте использовать ресурсы это лучшая функция java для обработки такого типа проблем –

ответ

2

Мой вопрос: Я должен очистить и закрыть BAOS?

Хорошая практика была бы всегда закрывать OutputStream но в случае ByteArrayOutputStream, методы flush и close ничего не делает, так что не требуется (проверьте ссылки, чтобы увидеть сам).

От Javadoc из close()

Закрытие ByteArrayOutputStream не имеет никакого эффекта.

Из Javadoc из OutputStream#flush()ByteArrayOutputStream не отменяет его)

Румянец метод OutputStream ничего не делает.

1

Это работает так:

метод flush() будет какой-то толчок все остальные элементы к месту назначения, как, когда вы спустить воду в туалете.

перед использованием close() вы должны использовать flush(), чтобы убедиться, что ничего не осталось, потому что если вы закрываете все, что отправлено, оно, вероятно, затеряется.

Вы должны использовать flush() и close() после того, как вы «использовали поток».

Это работает для всех OutputStreams.