【发布时间】: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