Следует ли явно закрыть OutputStream в StreamingResponseBody?

Я транслирую большой внешний ресурс, используя StreamingResponseBody в весеннем @RestController.

Вопрос: следует ли здесь явно закрывать OutputStream тела ответа?

@GetMapping("/{filename}")
public ResponseEntity<StreamingResponseBody> getFile(@PathVariable String filename) {
            StreamingResponseBody responseBody = outputStream -> {
                resolveExternally(outputStream, response, filename);

                //TODO should the stream be closed explicit here?
                //outputStream.close();
            };

            return ResponseEntity.ok(responseBody);
}

sth аналогичный stackoverflow.com/questions/48653533/…

Wojciech Wirzbicki 11.12.2018 12:45

Я знаю, но на этот вопрос нет ответа, поэтому он бесполезен. Вопрос по-прежнему: закрывать поток или нет?

membersound 11.12.2018 12:47

Нет ... Если вы не открываете / не управляете / не владеете потоком, вы не закрываете его. Поток управляется извне, и поэтому вы, кроме записи в него, не закрываете его. Вы не знаете, что другая сторона (которая управляет потоком) хочет с ним делать (возможно, напишите еще какие-то данные).

M. Deinum 11.12.2018 14:01

@ M.Deinum Итак, я правильно понял: если бы я разрешил файл вручную, например, в моей локальной системе, было бы нормально закрыть выходной поток внутри StreamingBodyResponse. Но если я разрешу это извне, например, через другой веб-сервис, я не должен его трогать? В случае если вы не могли бы добавить это как настоящий ответ, чтобы я мог его принять?

membersound 11.12.2018 15:02

Нет. Вы не открываете выходной поток здесь, поэтому не закрывайте его. Вы должны закрыть InputStream, который вы использовали для чтения файла.

M. Deinum 11.12.2018 15:28

О, верно, хорошо!

membersound 11.12.2018 15:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
6
1 377
0

Другие вопросы по теме