Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么HttpServletRequest中的RequestBody是InputStream?_Java_Http_Servlets_Web_Operating System - Fatal编程技术网

Java 为什么HttpServletRequest中的RequestBody是InputStream?

Java 为什么HttpServletRequest中的RequestBody是InputStream?,java,http,servlets,web,operating-system,Java,Http,Servlets,Web,Operating System,我知道在BIO中,web容器接收请求并将其包装在HttpServletRequest对象中,我们可以从中获取头和其他内容。 我认为HTTP消息已复制到用户空间。但是为什么请求主体仍然是一个inputstream?有人能解释一下吗?非常感谢 HttpServletRequest是来自servlet规范的接口。有许多servlet容器实现,包括jetty、tomcat和websphere等等。每个都有自己的HttpServletRequest实现 使用InputStream使servlet实现可以自

我知道在BIO中,web容器接收请求并将其包装在HttpServletRequest对象中,我们可以从中获取头和其他内容。
我认为HTTP消息已复制到用户空间。但是为什么请求主体仍然是一个inputstream?有人能解释一下吗?非常感谢

HttpServletRequest是来自servlet规范的接口。有许多servlet容器实现,包括jetty、tomcat和websphere等等。每个都有自己的
HttpServletRequest
实现

使用InputStream使servlet实现可以自由地从任何它喜欢的地方获取请求体值。一个实现可能使用本地文件和
FileInputStream
,另一个可能在内存中有一个字节数组并使用
ByteArrayInputStream
,另一个可能来自缓存或数据库等

字节数组上的
InputStream
的另一个好处是,一次只能在内存中保存一小块数据。不需要同时在内存中有一个大字节数组(如千兆字节)


设想一个视频共享站点,每个用户都可以上传1GB的视频。如果servlet规范强制使用字节数组而不是
InputStream
,那么具有8GB ram的服务器只能支持8次并发上传。使用
InputStream
可以为每次上传提供一个小的ram缓冲区,这样就可以支持数百/数千次并发1GB上传

我想还有一个问题,什么是流?在我看来,流是数据从套接字或文件到内存(用户空间)的抽象。现在我认为RequestBody已经复制到了用户空间,如果我们可以将其作为流处理,我是否可以认为Java中还有其他东西可以被视为inputstream。如果这是正确的,我还有另一个问题。RequestBody(作为流)只能读取一次。如果我想多次读取它,我必须将它放入字节数组或缓冲区中。所以问题是,如果我读取输入流并写入输出流(例如套接字),那么成本是多少。成本与我直接将请求主体发送到其他服务器相比(事实上,这是路由senerio,如spring cloud Zuul)