Java 分块编码与HttpServletResponse输出流上的写入?
分块编码比直接以小块形式写入HttpServletResponse输出流有什么好处 这样做就像下面所示的代码,其中完整的文件内容没有在应用程序内存中缓冲,而不是使用分块编码头发送。我正在使用下面的IoUtils.copy,它一次只能从输入流中读取8K字节Java 分块编码与HttpServletResponse输出流上的写入?,java,spring-mvc,servlets,ioutils,Java,Spring Mvc,Servlets,Ioutils,分块编码比直接以小块形式写入HttpServletResponse输出流有什么好处 这样做就像下面所示的代码,其中完整的文件内容没有在应用程序内存中缓冲,而不是使用分块编码头发送。我正在使用下面的IoUtils.copy,它一次只能从输入流中读取8K字节 @GetMapping("/content") public void getContent(final HttpServletRequest request, final H
@GetMapping("/content")
public void getContent(final HttpServletRequest request,
final HttpServletResponse response) throws IOException {
try(final InputStream is = FileUtils.openInputStream(new File("src/main/resources/test_file.txt"))) {
//Do something with is
response.setHeader("ContentType", MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setContentLength(70000);
IOUtils.copy(is, response.getOutputStream());
response.flushBuffer();
}
}
如果不使用分块或固定长度的传输编码,则整个文件内容将缓冲在内存中,因为
HttpServletResponse
必须在发送任何内容之前填充content length
头。您的响应是有意义的。虽然我的问题不完整,但现在已经编辑好了。我的意思是提供一个内容长度标题。我的意图是理解当提供固定内容长度的头并且使用较小的缓冲区大小复制输出流时与使用分块头的响应时的区别。它将忽略您的内容长度
头,并按照我所描述的方式进行操作。正确的方法是调用setFixedLengthStreamingMode()
,但最好提供正确的长度。我已经运行了一些测试,但没有看到这种行为。调用者得到的内容长度为0,文件可以正常下载。100秒的并发请求,并且没有OOM错误。因此,您必须使用分块streamingmode或连接:close
。