Закрытие ByteArrayOutputStream в приложении для Android
В приложении Android я отправляю снимок, взятый из Camera Intent
, поэтому мне нужно преобразовать Bitmap
в массив байтов. Для этого я использую ByteArrayOutputStream
следующим образом:
private byte[] getRawImageData(Bitmap source) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] rawImageData = null;
try {
source.compress(CompressFormat.JPEG, DEFAULT_COMRESSION, baos);
rawImageData = baos.toByteArray();
} finally {
try {
baos.close();
} catch (IOException e) {
// handle exception here
}
}
return rawImageData;
}
Все работает отлично и все, реальный вопрос заключается в различии в документации ByteArrayOutputStream
между javadoc и doc от Android.
Javadoc читает
Закрытие ByteArrayOutputStream не влияет.
Android doc гласит:
Закрывает этот поток. Это освобождает системные ресурсы, используемые для этого потока.
Я закрываю поток, неважно, что, но я хотел бы знать, какая документация правильная и почему они разные.
Ответы
Ответ 1
ByteArrayOutputStream
- поток, основанный на памяти (управляемый и заполненный пользователем в коде), поэтому нет эффекта, когда вы вызываете close()
на нем. Единственный способ очистить свою память - это отменить все ссылки на этот объект. К тому времени Garbage Collector будет запускаться в ближайшее время в будущем и выполнять свою работу по очистке таких объектов.
Однако закрытие потока требуется, когда вы задействуете ресурсы, такие как файлы или потоки сокетов ввода/вывода (например, OutputStream
, InputStream
). Когда вы вызываете close()
в таких потоках, JVM безопасно выпускает свою локальную память/занятую память и избегает любых проблем OutOfMemory.
В общем, хорошо (а иногда и жизненно важно) вызывать close()
для любого типа потока, когда это больше не требуется, но что более важно, лучше знать, почему мы должны звонить.
Ответ 2
Это реализация ByteArrayOutputStrem.close
public void close() throws IOException {
}
API говорит, что закрытие ByteArrayOutputStream не влияет
поэтому безопасно опускать close(), с другой стороны, это не наносит вреда, JVM в любом случае пропускает вызовы на пустые методы. Он может использоваться, чтобы избежать предупреждений. Ресурс не закрыт.
Ответ 3
Закрытие потока не наносит вреда, но не закрывает его.
Так что лучше закрыть его.