是否应该在 StreamingResponseBody 中显式关闭 OutputStream?

Should OutputStream be closed explicit in StreamingResponseBody?

我在 spring @RestController.

中使用 StreamingResponseBody 流式传输大量外部资源

问题:响应体的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);
}

它将被容器关闭。检查 StreamingResponseBodyReturnValueHandler.

OutputStream 包装原生 HttpServletResponse.

HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
Assert.state(response != null, "No HttpServletResponse");
ServerHttpResponse outputMessage = new ServletServerHttpResponse(response);

如果你顺着它往下走,你会到达 CoyoteAdapter,它正在调用 finishResponse() 并关闭 OutputBuffer。