Подтвердить что ты не робот

Закрытие 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 гласит:

Закрывает этот поток. Это освобождает системные ресурсы, используемые для этого потока.

Я закрываю поток, неважно, что, но я хотел бы знать, какая документация правильная и почему они разные.

4b9b3361

Ответ 1

ByteArrayOutputStream - поток, основанный на памяти (управляемый и заполненный пользователем в коде), поэтому нет эффекта, когда вы вызываете close() на нем. Единственный способ очистить свою память - это отменить все ссылки на этот объект. К тому времени Garbage Collector будет запускаться в ближайшее время в будущем и выполнять свою работу по очистке таких объектов.

Однако закрытие потока требуется, когда вы задействуете ресурсы, такие как файлы или потоки сокетов ввода/вывода (например, OutputStream, InputStream). Когда вы вызываете close() в таких потоках, JVM безопасно выпускает свою локальную память/занятую память и избегает любых проблем OutOfMemory.

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

Ответ 2

Это реализация ByteArrayOutputStrem.close

public void close() throws IOException {
}

API говорит, что закрытие ByteArrayOutputStream не влияет

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

Ответ 3

Закрытие потока не наносит вреда, но не закрывает его. Так что лучше закрыть его.