遇到一些在servlet中执行此操作的代码:
while ((read = request.getInputStream().read(bytes)) != -1)
buffer.write(bytes, 0, read);
虽然在大多数情况下,request.getInputStream()
只是在某个地方返回一个字段,但我在想可能存在动态包装器或此类包装器可能进入不良状态。
文档中是否写有关于做这种事情的示例,我可以以此为例将getInputStream()
代码从循环中拉出来?
答案 0 :(得分:1)
可以多次调用getInputStream()
,Servlet规范仅禁止将其与getReader()
一起使用。根据{{3}}:
使用ServletInputStream将请求的主体作为二进制数据检索。可以调用此方法或getReader()来读取正文,而不能同时读取两者。
返回:
包含请求主体的ServletInputStream对象
投掷:
- IllegalStateException-如果已为此请求调用getReader()方法
- IOException-如果发生输入或输出异常
一种特定的Servlet实现可以自由返回一个包装器对象,但总有一天,人们总是希望ServletInputStream
可以在某个时候抛出IOException
(例如,连接重置)。
如果以Apache Tomcat为例,则HTTP连接处理逻辑在the ServletRequest#getInputStream()
method javadoc中,并且非常具有防御性。 HTTP连接和基础套接字AbstractProtocol.ConnectionHandler.process()
method的清理代码,因此应用程序错误不应干扰资源清理。