我知道在BIO中,Web容器接收到请求并将其包装在HttpServletRequest对象中,我们可以从中获取Header和其他内容。 我认为HTTP消息已复制到用户空间。但是为什么请求主体仍然是输入流?有人可以解释吗?非常感谢!
答案 0 :(得分:1)
HttpServletRequest
是Servlet规范的接口。有许多servlet容器实现,包括jetty,tomcat和Websphere等。每个都有自己的HttpServletRequest
实现。
使用InputStream可以使servlet实现自由,以便从喜欢的地方获取请求正文值。一种实现可能使用本地文件,而FileInputStream
,另一种实现可能在内存中具有字节数组并使用ByteArrayInputStream
,另一种实现可能来自缓存或数据库等。
InputStream
相对于字节数组的另一个好处是,您一次只能在内存中保留一小块内存,就可以对其进行流式传输。不需要一次在内存中拥有大字节数组(例如,千兆字节)。
想象一个视频共享站点,每个用户可以在其中上传1GB的视频。如果servlet规范是使用字节数组而不是InputStream
,则具有8GB内存的服务器只能支持8个并发上传。使用InputStream
,您可以为每个上传文件保留一个较小的ram缓冲区,因此可以支持成百上千个并发的1GB上传文件