2

我能够通过输入流从请求对象中提取内容。因此,如果它是一个流,是否意味着数据正在通过 os->webcontainer->etc 等从客户端“实时”传输到 servlet?

如果我在请求中传递大量数据,它是缓存在 OS/JVM 的某个地方还是直接从源实时读取?我可以打开请求 inputStream 到 tera/peta 字节的数据,并将其逐字节写入输出流而不会出现任何问题(忽略它所花费的时间和超时)?

如果它们被缓存,请更新,为什么它们是流式传输的?打开后只能读取一次(并且需要存储),相反,它们应该可以根据需要多次读取。

只是随机查询,没有实际用途。

4

1 回答 1

1

它们没有被缓存。如果某些内容已被缓存,则可以重新使用。然而,这些流是不可重用的,因此绝对不会被缓存。

但是,它们很有可能被缓冲在内存中,甚至是在本地磁盘文件系统而不是内存中。这完全取决于服务器实现甚至底层操作系统(也称为“虚拟磁盘”或“交换磁盘”,取决于所使用的操作系统)。然而,这个缓冲区通常没有兆字节的数量级那么大。例如,标准 Java SEBufferedInputStream类有一个 8KB 的内部缓冲区。

我可以打开请求 inputStream 到 tera/peta 字节的数据,并将其逐字节写入输出流而不会出现任何问题(忽略它所花费的时间和超时)?

您可能会达到通常在服务器上可配置的 HTTP POST 大小限制。例如,Tomcat 中默认为 2GB,但可以完全禁用。另请参阅HTTP 连接器maxPostSize上的设置。

于 2013-06-10T21:30:11.717 回答