Я транслирую большой внешний ресурс, используя 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);
}
Я знаю, но на этот вопрос нет ответа, поэтому он бесполезен. Вопрос по-прежнему: закрывать поток или нет?
Нет ... Если вы не открываете / не управляете / не владеете потоком, вы не закрываете его. Поток управляется извне, и поэтому вы, кроме записи в него, не закрываете его. Вы не знаете, что другая сторона (которая управляет потоком) хочет с ним делать (возможно, напишите еще какие-то данные).
@ M.Deinum Итак, я правильно понял: если бы я разрешил файл вручную, например, в моей локальной системе, было бы нормально закрыть выходной поток внутри StreamingBodyResponse. Но если я разрешу это извне, например, через другой веб-сервис, я не должен его трогать? В случае если вы не могли бы добавить это как настоящий ответ, чтобы я мог его принять?
Нет. Вы не открываете выходной поток здесь, поэтому не закрывайте его. Вы должны закрыть InputStream, который вы использовали для чтения файла.
О, верно, хорошо!




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