【问题标题】:Will Print Writer returned by HttpServletResponse use BufferedWriterHttpServletResponse 返回的 Print Writer 是否会使用 BufferedWriter
【发布时间】:2020-04-06 12:02:18
【问题描述】:

我正在开发一个 Spring Boot 2.2 应用程序,我想公开一个用于下载 CSV 文件的 Rest API。 我正在 HttpServletResponse 返回的 Writer 中写入 CSV 数据。

    @RequestMapping(value = "/api", method = RequestMethod.GET)
    public void messages(HttpServletResponse response) throws IOException {
        PrintWriter writer = response.getWriter();
        CSVWritter.write(writer, dataService.fetchAllUsers());
        writer.flush();
    }

根据 HttpServletResponse API,Java 文档编写器方法将返回 PrintWriter。但是在 Spring boot 引用不是 PrintWriter 类,而是 org.springframework.security.web.util.OnCommittedResponseWrapper$SaveContextPrintWriter[delegate=org.apache.catalina.connector.CoyoteWriter@37ef8360]

我希望数据应该以块的形式写入浏览器,即只有在缓冲区已满时才刷新到浏览器。那么响应对象返回的 writer 是 Buffered writer 还是内部使用了 buffered writer?

【问题讨论】:

  • PrintWriter 本身是缓冲的,它在 Javadoc 中是这样说的。实际返回的对象必须是PrintWriter或者派生类,所以也必须缓冲。
  • 我在 javadoc docs.oracle.com/javase/8/docs/api/java/io/PrintWriter.html 中找不到任何此类信息
  • 那么为什么它一直在谈论冲洗?冲洗什么?
  • 我所知道的是java中的每个编写器实现都有小缓冲区。然而 Buffered Writer 是一种特殊的缓冲写入器,它牢记性能。我在问那个。
  • @user207421 - PrintWriter 是一个装饰器。在其文档中对刷新的引用是关于在委托上调用 flush() 作为每次调用 print()println() 的一部分。

标签: java spring spring-boot spring-mvc


【解决方案1】:

ServletResponse docs 不是显式的,但 flushBuffer()getBufferSize()setBufferSize() 方法的存在强烈暗示输出流/写入器确实被缓冲了。

实际上,必须设置Content-Length(或支持分块编码,其中内容长度事先不知道)。

注意:PrintWriter 是一个装饰器;它不是内部缓冲的,但可以装饰缓冲的写入器。其文档中对“刷新”的引用与每次写入后是否在装饰的 Writer 上显式调用 flush() 有关。

【讨论】:

    猜你喜欢
    • 2011-11-09
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2021-05-13
    • 2014-10-26
    相关资源
    最近更新 更多