我正在编写一个Web应用程序,它会发送一些直接文件以响应某些请求。我想用Java来处理这个问题,而不是nginx等。在标准servlet中,唯一的选择是使用java.io.OutputStream
的{{1}}。
HttpServletResponse
这会复制字节缓冲区,而不是必需的。我想看看我是否可以通过使用NIO缓冲区和通道来提高性能。我知道Jetty正在使用NIO,因为我服务器中的“连接器”属于org.eclipse.jetty.server.nio.SelectChannelConnector类。
有没有办法从servlet获取底层通道?或者有没有办法定义使用File file = ...
response.setContentLength((int)file.length());
FileInputStream in = new FileInputStream(file);
IOUtils.copy(in, response.getOutputStream());
而不是java.nio
的Jetty特定处理程序?
他们的文档显示Jetty "hello world" handler,但也使用了java.io
和HttpServletResponse
个流。
答案 0 :(得分:1)
我将看一下DefaultServlet,它已经做了类似的事情,并且还作为servlet如何使用直接缓冲区来更有效地提供类似静态资源的示例。
第758行是sendData方法的开头。
通常我们建议人们只要配置DefaultServlet,如果他们关心提供静态内容的性能,因为它也让你搞乱缓存标题和那个同类
祝你好运答案 1 :(得分:0)
这会使字节缓冲超出必要的范围。
如果您使用分块流模式,则不会。当你这样做时根本没有字节缓冲区,除非IOUtils.copy()
这样做,在这种情况下不使用它,自己写下4行代码。
ByteBuffers的原因是Java将尝试正确设置Content-Length响应标头,方法是在BB中累积输出,然后在发送标头然后将BB内容作为正文之前获取其大小。自己设置标题我相信没有实际效果。