【问题标题】:nature of input/output streams in a servletservlet 中输入/输出流的性质
【发布时间】:2013-06-06 15:08:56
【问题描述】:

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

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

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

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

【问题讨论】:

  • 例如,对于 Tomcat:stackoverflow.com/questions/2943477/…
  • 有趣;但是离开供应商特定的实现,输入/输出的性质是什么?它们最终会在某个级别缓存吗?如果是这样,为什么它们是流媒体?只能读取一次。如果被缓存,我们可以一次又一次地重读它们
  • nature 没有被“Sun/Oracle servlets spec”指定(你可以用谷歌搜索它,然后尝试找到任何关于底层实现的提及。——没有)。我想,这些只是通过 single TCP 连接传递的数据,因此没有显式缓存(也许,只有在巨大的 POST 查询不完全适合 RAM 的情况下,操作系统才会进行隐式页面交换)
  • 然后,您可以随时查看 Tomcat/Jetty/whatever 源代码内部并亲自查看。但是,最有可能的是,它只是一个单独的 TCP 连接,没有显式缓存。
  • @VictorSorokin 谢谢 :) 我要试试看能否逐字节传输 100MB 文件

标签: java jakarta-ee servlets web-applications web


【解决方案1】:

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

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

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

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

【讨论】:

  • 您的意思可能是 2 MB
猜你喜欢
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2019-01-25
  • 2014-01-06
相关资源
最近更新 更多