【问题标题】:Should OutputStream be closed explicit in StreamingResponseBody?是否应该在 StreamingResponseBody 中显式关闭 OutputStream?
【发布时间】:2018-12-11 11:42:31
【问题描述】:

我正在使用 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

标签: java spring spring-mvc spring-rest spring-web


【解决方案1】:

它将被容器关闭。检查StreamingResponseBodyReturnValueHandler

OutputStream 包装了一个原生的HttpServletResponse

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

如果你继续下去,你会到达CoyoteAdapter,它正在调用finishResponse()并关闭OutputBuffer。

【讨论】:

    猜你喜欢
    • 2018-05-01
    • 2011-05-05
    • 2016-11-20
    • 1970-01-01
    • 2010-11-28
    • 2012-01-29
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多